如何在制作下编译多个文件
how to compile multiple file under make
我有几个.cpp和.hpp文件。我想使用 make 编译和 lnk 它们。我该怎么做?
sample.cpp sample.hpp
sample_2.cpp sample_2.hpp
sample_3.cpp sample_3.hpp
...
and
main.cpp
I have done :
default:
g++ -c sample sample.cpp
g++ -c sample_2 sample_2.cpp
g++ -c sample_3 sample_3.cpp
g++ -o main main.cpp sample sample_2 sample_3
当我在终端上键入make时,它给出错误:
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 10
而不是有一个执行所有操作的单个default
目标,每个单独的输出都应该是一个 make 目标。这允许 make 正常工作,一次以正确的顺序构建一件事(如果依赖关系图允许,则并行构建),并在每一步正确报告错误。 此外,非常重要的是,通过告诉每个单独的目标以及它们所依赖的内容,您可以确保当依赖项更改时,将确切地知道由于更改的依赖项而需要重建哪些目标。这是Make的最佳功能。
在您的情况下,最终目标是main
所以您希望default
目标构建它,您可以通过说main
是main
的先决条件来做到这一点:
default: main
现在你需要说 如何构建main
,这取决于各种目标文件,所以我们告诉 make :
main: main.o sample.o sample_2.o sample_3.o
这表示它取决于这些对象文件(它们是其先决条件),因此将首先构建它们。这些对象中的每一个都是另一个将单独构建的 make 目标。
构建完所有先决条件后,将使用配方将它们链接到main
中,因此我们需要将配方添加到上述目标:
main: main.o sample.o sample_2.o sample_3.o
g++ main.o sample.o sample_2.o sample_3.o -o main
Make 有很多缩写来简化事情,例如$(CXX)
是C++编译器,$@
表示当前目标,$^
表示当前目标的先决条件,因此可以将该规则简化为:
main: main.o sample.o sample_2.o sample_3.o
$(CXX) $^ -o $@
这实际上是您所需要的,Make 已经知道如何使用其内置规则构建.o
先决条件,因此它会看到一个名为main.cpp
的文件,并知道它可以编译该文件以创建main.o
,并查看sample.cpp
并将其编译为sample.o
等。 它将从 makefile 创建一个依赖关系图,以决定构建default
需要哪些目标(这意味着它决定它需要main
并且需要main.o
、sample.o
等,并且它们需要已经存在的main.cpp
和sample.cpp
等,因此它可以开始构建先决条件,直到它拥有链接main
所需的一切,然后它可以做到这一点并完成。
现在,如果您更改sample_2.cpp
并再次运行make
,它将看到sample_2.o
已过时,需要重新编译,但其他.o
文件仍然可以(它们比它们所依赖的.cpp
文件更新),因此它将重新编译sample_2.o
并重新链接main
而不是重建其他所有内容。
实际上,您可以通过使用将对象链接到可执行文件的默认方法来进一步简化它:
LINK.o = $(CXX)
default: main
main: main.o sample.o sample_2.o sample_3.o
这就是你所需要的!但是,使用更冗长的版本通常更清晰,尤其是对于初学者而言,因为当您不熟悉Make的所有自动规则和变量时
,自定义起来更容易。告诉 make 对头文件的依赖关系也很有帮助,这样当头文件发生变化时,事情就会重建。这可以使用编译器自动生成先决条件,但对于简单的情况,您可以直接将其添加到 makefile 中
,例如sample.o: sample.hpp sample.cpp
- 使用 MEX 编译C++文件
- 获取 clang++:错误:在编译文件系统库的代码时
- 如何交叉编译C++文件
- 使用 MinGW 在 Windows 上的命令行编译C++文件
- 选择特定版本的 Visual Studio 命令行工具包,并根据特定版本的C++运行时环境编译文件
- 解析模板和范围后获取编译文件?
- 我的 PowerShell 脚本无法按预期工作(用于编译C++文件)
- 如何在不制作Visual Studio 2017项目的情况下编译C++文件?
- 'void *' 'void (*) (bool)' 指针使用 c ++ 编译器在 C 中编译文件的错误
- 在没有节点GYP的目标平台上编译C/C 文件
- 生成文件似乎以错误的顺序编译文件
- 编译 C++ 文件失败,因为找不到"ssize_t"的定义
- NeatBeans Makefile:麻烦编译.H文件
- 我无法编译文件系统库
- 在不使用预编译头C++项目中编译 C 文件
- 无法使用 Xcode 和终端在 Mac OS 上使用 OpenGL 库编译 c++ 文件
- 获取编译文件的列表,并由Make Project包含
- MinGW .h 编译文件不起作用:此文件的版本与您运行的 Windows 版本不兼容
- 编译 c++ 文件时出错:未定义的符号
- C++编译文件