多文件编译与链接
对多文件进行编译时可以直接使用
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++中的高性能并行编程与优化。

被折叠的 条评论
为什么被折叠?



