在Linux(Ubuntu)上编译SFML

3

在编译SFML应用程序时,

  • 需要先创建带有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
@Garf365:再多说几句,然后将其发布为答案。 - Ionut
@Ionut,已经完成了,如果你有任何反馈,请毫不犹豫地提出;) - Garf365
4个回答

6

在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

在这里您可以全面了解 make


谢谢!我有一个问题,当在终端中输入make main.cpp时,我得到了错误信息Makefile:19: *** missing separator. Stop. - jonsno
谢谢,我修好了!是因为使用空格而不是制表符!非常感谢! - jonsno

4
您可以编写一个.sh脚本来执行以下命令:
g++ -c main.cpp
g++ main.o -o sfml-app -lsfml-graphics -lsfml-window -lsfml-system

简单的解决方案,对于单文件项目可以很好地工作。但是当你有更多的文件依赖时,很快就会变得难以维护,并且构建应用程序需要太长时间。 - Garf365

2

一个解决方案是使用构建自动化工具。存在许多不同的工具,每个工具都有其优点和缺点。

对于小型项目,我个人使用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

糟糕的 Makefile;应该使用标准变量(COMPILE.ccCXXFLAGS);请查看使用 make -p 给出的默认规则。而且,您总是应该使用 -Wall -Wextra 调用 g++,可能还要加上 -g - Basile Starynkevitch
4
“Bad”这个词有些过于严厉了,它只是一个能解决问题的最小可用Makefile。在这种情况下,我认为对于那些没有接触过Make的人来说,这更容易理解,相比一个“好”的Makefile。如果提问者愿意的话,可以阅读文档并学习如何编写好的Makefile,但如果他能在不必先阅读完整的Make手册的前提下掌握基础知识,可能更倾向于这样做。 - Ionut
@BasileStarynkevitch 我同意你的观点,我们应该使用标准变量,我也同意使用c++标志。我自己也是这样做的。但这不是问题所在。此外,我只是提供了一个构建自动化工具的预览,其中有许多其他工具。正因为如此,我鼓励大家在互联网上阅读一些文档! - Garf365
@BasileStarynkevitch 我添加了一句话来鼓励所有对makefile感兴趣的人阅读文档。这个答案并不是关于make和Makefile的介绍。 - Garf365
非常感谢您的回答! - jonsno
显示剩余2条评论

0
这是一个我喜欢在Linux上使用的bash脚本。它有四种模式:编译,编译并运行,优化后发布编译和优化发布编译然后运行游戏。
将其保存为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文件,并输出到bin / Game。当然,您可以根据自己的喜好进行修改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接