在 linux (ubuntu) 上编译 SFML

Compiling SFML on linux (ubuntu)

在编译 SFML 应用时,

我已经成功编译运行我的第一个应用程序,但是我们不能缩短这个过程吗,我的意思是我每次编译和制作应用程序时都必须输入这个吗?

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

您可以编写一个 .sh 脚本来执行命令:

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

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

Personnaly,对于小项目,我使用 Make。您在一个名为 Makefile 的文件中编写描述文件之间关系以及如何实现每个步骤的规则。例如,项目的 minimal 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

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.

这是我喜欢在 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。当然你可以根据自己的喜好修改这个。