2016-02-29 130 views
2

在编制SFML应用,编译SFML在Linux(Ubuntu的)

  • 我需要先创建一个与SFML代码cpp文件并保存文件
  • 然后写命令:g++ -c main.cpp编译并创建目标文件。
  • 最后,创建SFML应用程序,我需要写命令:
    g++ main.o -o sfml-app -lsfml-graphics -lsfml-window -lsfml-system

我是能够成功地编译和运行我的第一个应用程序,但我们不能缩短这个过程中,我的意思是做我每次编译时都必须输入这个内容,并进行申请?

我也有关于一般编译C++文件的这个问题。每次我必须写g++ filename.cpp -o filename。我怎样才能缩短这个过程? 谢谢。

+4

看到构建自动化工具像make,cmake ... – Garf365

+0

@ Garf365:再说几句话,并将其作为回答发布 – Ionut

+0

@Ionut它已完成,如果您有反馈意见,请不要犹豫;) – Garf365

回答

5

Linux上使用Makefile是很常见的。 Makefile更简单,如果您将主要源文件命名为您想要调用完成的程序。

所以,如果您在main.cpp文件重命名为sfml-app.cpp,然后创建一个名为Makefile文件,该文本复制到其中:

# optional flags (if the compiler supports it) 
CXXFLAGS += -std=c++11 

# HIGHLY RECOMMENDED flags 
CXXFLAGS += -Wall -Wextra -pedantic-errors 

# required for SFML programs 
LDLIBS := $(shell pkg-config sfml-all --libs) 

# The rest will turn any source file ending in .cpp 
# into a program of the same name 

SOURCES := $(wildcard *.cpp) 
PROGRAMS := $(patsubst %.cpp,%,$(SOURCES)) 

all: $(PROGRAMS) 

clean: 
    rm $(PROGRAMS) 

类型:make建项目和make clean将其删除。

注:rm $(PROGRAMS)命令的缩进必须TAB,而不是空格。

如果要编译同一目录中的其他程序,只需在目录another-app.cpp中创建另一个源文件,然后make就会自动将其转换为程序。

Makefile会变成任何源文件(在结尾的.cpp)到同一名称的计划。

注意:当你想建立更大,多文件的程序时,你需要一个不同的Makefile。如果你是认真的规划,那么你应该学习make

在这里,您可以learn all about make

+0

谢谢!在终端输入'make main.cpp'时,我遇到了一个问题,出现错误'Makefile:19:*** missing separator。 Stop.' – samjoe

+0

谢谢我修好了!这是由于使用空格而不是标签!非常感谢! – samjoe

2

您可以编写一个执行的命令的脚本.SH:

g++ -c main.cpp 
g++ main.o -o sfml-app -lsfml-graphics -lsfml-window -lsfml-system 
+0

简单的解决方案,适用于一个文件项目。但是当你有更多的文件,依赖关系时,它很快就难以维护,并且构建应用程序的时间太长。 – Garf365

1

一种解决方案是使用构建自动化工具。存在很多不同的工具,每个工具都有强大和弱点。

Personnaly,对于小项目,我使用Make。您在一个名为Makefile的文件中写入规则,这些规则描述了文件之间的关系以及如何实现每个步骤。例如,最小 Makefile文件为您的项目将是:

sfml-app: main.o 
    g++ main.o -o sfml-app -lsfml-graphics -lsfml-window -lsfml-system 

main.o: main.c 
    g++ -c main.cpp 

此文件位于项目的根。您只需输入“make”命令即可启动构建。如果你愿意,你会在互联网上找到很多文档。请参阅https://en.wikipedia.org/wiki/Make_%28software%29我鼓励您阅读makefile以正确使用它,并且能够使用它的力量。

另外,有人可以建议你使用另一个构建自动化工具:这是一个人的选择!您可以在此找到现有工具的列表(并非详尽无遗):https://en.wikipedia.org/wiki/List_of_build_automation_software

+0

Bad'Makefile';应该使用标准变量('COMPILE.cc','CXXFLAGS');请参阅'make -p'给出的默认规则。而你永远* *应该调用'G ++'和'-Wall -Wextra'大概也'-g' –

+4

** **错误是过于苛刻,这是一个最低工作Makefile文件,解决了这个问题。在这种情况下,我认为对于之前没有听说过Make的人来说更合适,因为它比* good * Makefile更容易理解。如果OP想要的话,他可以阅读文档并学习如何编写好的Makefiles,但是如果他无需阅读完整的Make手册就能掌握基础知识,他可能更倾向于这样做。 – Ionut

+0

@BasileStarynkevitch我同意你的看法,我们应该使用标准变量,我也赞同C++的标志。我用这个。但这不是问题。另外,我只是预览了其他许多构建自动化工具。这是我鼓励在互联网上阅读一些文件! – Garf365

0

这里有一个bash脚本我想在Linux上使用。它有四种模式:编译,编译和运行,为优化发布编译,并通过优化进行编译,然后运行游戏。

保存此作为build.sh,然后使用Linux终端类型“使用chmod + X build.sh”

#######!/bin/bash 

appRunning=1 

while [ $appRunning == 1 ]; do 
    echo Compile debug[1], Compile and run debug[2], Compile release[3], Compile and run release[4], Exit[5] 
    read user 

    if [[ $user == 1 ]]; then 
     clear 
     echo Compiling for debug... 
     echo 
     g++ -c src/*.cpp -std=c++14 -Werror -m64 
     g++ *.o -o bin/debug/Game -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio -lsfml-network 
     read -n 1 -s 
     clear 

    elif [[ $user == 2 ]]; then 
     clear 
     echo Compiling and running for debug... 
     echo 
     g++ -c src/*.cpp -std=c++14 -Werror -m64 
     g++ *.o -o bin/debug/Game -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio -lsfml-network 
     ./bin/debug/Game 
     read -n 1 -s 
     clear 

    elif [[ $user == 3 ]]; then 
     clear 
     echo Compiling for release... 
     echo 
     g++ -c src/*.cpp -std=c++14 -m64 -O3 -fexpensive-optimizations -s 
     g++ *.o -o bin/release/Game -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio -lsfml-network 
     read -n 1 -s 
     clear 

    elif [[ $user == 4 ]]; then 
     clear 
     echo Compiling and running for release... 
     echo 
     g++ -c src/*.cpp -std=c++14 -m64 -O3 -fexpensive-optimizations -s 
     g++ *.o -o bin/release/Game -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio -lsfml-network 
     ./bin/release/Game 
     read -n 1 -s 
     clear 
    elif [[ $user == 5 ]]; then 
     exit 
    fi 
done 

它编译位于所谓的“SRC”文件夹中的所有cpp文件并输出到仓/游戏。当然,你可以修改它以适应你自己的喜好。