多文件编译与链接
对多文件进行编译时可以直接使用
g++ hello.cpp main.cpp -o main
命令对多文件进行编译和链接。但此操作和单文件编译类似,会将所有文件进行编译。
所以我们可以使用
g++ -c hello.cpp -o hello.o
g++ -c main.cpp -o main.o
两个命令,分别对hello.cpp
和main.cpp
文件进行编译,生成临时文件hello.o
和main.o
。-c
表示只对文件进行编译,不对文件进行链接。最后再使用
g++ hello.o main.o -o a.out
命令,将两个临时文件进行链接生成最终的可执行文件。
这样的话当我们只对hello.cpp
文件进行了更改时,只需要重新执行一遍
g++ -c hello.cpp -o hello.o
命令,将hello.cpp
文件进行重新编译,然后再使用
g++ hello.o main.o -o a.out
将两个文件进行链接就可以了,省去了其他未变动文件的编译时间。
make
但当项目文件过多时,我们还一个一个手动的去调用g++ -c xxx.cpp -o xxx.o
命令非常麻烦,所以出现了make
这个工具,只需要我们写出不同文件之间的依赖关系和生成各文件的规则,如下:
使用make a.out
命令就可以直接构建出最终的a.out
的可执行文件。
但是make
有如下缺点:
● make
的语法和行为在不同平台(如 Linux、macOS、Windows)上可能不一致。
● Makefile 缺乏对模块化项目的良好支持,难以管理大型项目中的多个子项目或库。
● make
需要手动编写依赖规则(如.h
文件和 .cpp
文件之间的依赖关系)。对于复杂的项目,手动维护依赖关系非常繁琐且容易遗漏。
● make
的功能有限,难以支持现代构建需求(如自动化测试、打包、安装等)。需要结合其他工具(如 autotools
)来实现更复杂的功能。
所以当项目有跨平台需求、项目比较复杂时,make
问题就比较多了。
CMake
所以出现了CMake
,针对于make
的缺点,CMake
有以下优点(一一对应):
● CMake
可以生成适用于不同平台的构建文件(如 Makefile、Ninja、Visual Studio 项目文件等)。开发者只需编写一次 CMakeLists.txt,即可在多个平台上构建项目。
● CMake
支持模块化项目结构,可以轻松管理多个子项目或库。通过 add_subdirectory
和target_link_libraries
实现模块化构建。
● CMake
可以自动检测源文件和头文件之间的依赖关系,无需手动编写。支持第三方库的自动查找和链接。
● CMake
支持自定义模块和脚本,可以根据项目需求扩展功能。提供 find_package
机制,方便集成第三方库。
该文档是我在学习了双笙子佯谬
UP主的视频之后的一个学习总结,感兴趣的小伙伴可以去看该UP主的原视频:现代C++中的高性能并行编程与优化。