在 linux (ubuntu) 上编译 SFML
Compiling SFML on linux (ubuntu)
在编译 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
。我怎样才能缩短这个过程?
谢谢。
您可以编写一个 .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。当然你可以根据自己的喜好修改这个。
在编译 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
。我怎样才能缩短这个过程?
谢谢。
您可以编写一个 .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。当然你可以根据自己的喜好修改这个。