【问题标题】:Compiling SFML on linux (ubuntu)在 linux (ubuntu) 上编译 SFML
【发布时间】:2016-06-12 08:37:03
【问题描述】:

在编译 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。我怎样才能缩短这个过程? 谢谢。

【问题讨论】:

  • 查看构建自动化工具,如 make、cmake...
  • @Garf365:多说几句,然后把它作为答案发布
  • @Ionut 已经完成了,如果您有任何反馈,请不要犹豫;)

标签: c++ linux ubuntu terminal sfml


【解决方案1】:

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

【讨论】:

  • 谢谢!我有一个问题,在终端输入make main.cpp 时,我收到错误Makefile:19: *** missing separator. Stop.
  • 谢谢我修好了!这是由于使用了空格而不是制表符!非常感谢!
【解决方案2】:

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

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

【讨论】:

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

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

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

【讨论】:

  • Makefile;应该使用标准变量(COMPILE.ccCXXFLAGS);请参阅make -p 给出的默认规则。而且你总是应该用-Wall -Wextra调用g++,可能还有-g
  • Bad 太苛刻了,它是解决问题的最小工作 Makefile。在这种情况下,我认为它更适合以前没有听说过 Make 的人,因为它比 good Makefile 更容易理解。如果 OP 愿意,他可以阅读文档并学习如何编写好的 Makefile,但如果他能够掌握基础知识而无需先阅读完整的 Make 手册,他可能更倾向于这样做。
  • @BasileStarynkevitch 我同意你的观点,我们应该使用标准变量,我也同意 c++ 标志。我用这个。但这不是这里的问题。另外,我只是预览了一个构建自动化工具以及许多其他工具。为此,我鼓励在互联网上阅读一些文档!
  • @Ionut 谢谢你,这个答案真的是我的目标!
  • @BasileStarynkevitch 我添加一句鼓励对 makefile 感兴趣的每个人阅读文档。这个答案不是对make和Makefile的介绍
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2021-03-18
    • 2012-04-09
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多