将多个C++文件编译在一起而不是单独编译
Compiling multiple C++ files together versus sepearately
对于大型C++项目,最好是在一次大型 g++ 调用中编译所有 cpp 文件,还是将它们全部单独编译,然后链接结果或介于两者之间的东西(例如一次编译命名空间/模块/子目录的所有文件)。
实际区别是什么?哪种方法最快,为什么?
单独编译文件然后链接是更好的做法,因为它允许您在修改时仅重新编译受影响的文件。因此,在第一次构建后,构建时间最小化。
实际上,出于上述原因,大多数时间都使用此方法准备makefile。
有一个技巧。假设你有一堆文件
file1.cpp
file2.cpp
...
fileN.cpp
然后,您可以创建"master.cpp"文件:
#include "file1.cpp"
#include "file2.cpp"
...
#include "fileN.cpp"
并编译它。
通过这种方式,您可以轻松比较单个文件和文件集的构建时间。
如果你在UNIX上,使用"时间"来获取gcc调用的执行时间。
当然,瓶颈是"聚集"操作 - 链接阶段。有一个黄金链接器(维基百科)可以解决ELF文件的这个问题。
显然,并行启动多个编译器进程将导致更高效的 CPU 使用率,因为您使用的是多核或多 CPU 系统。但是,整个项目的主要瓶颈仍然是链接器,它实际上必须从所有目标文件创建可执行文件。
除此之外,这实际上取决于项目本身。文件之间有多少个依赖项?哪些需要先编译?你最好让你的构建系统为你做出这些决定。
相关文章:
- 如何在Visual Studio中为CUDA项目启用单独的编译
- 混合单独编译的对象
- 为什么<<低;和 cout<<v.begin;单独给出错误,但 cout <<(lower.begin());没有给出任何错误,并使代码易于编译
- cmake cuda在Windows上单独的编译静态LIB链接错误,但在Ubuntu上没有
- 是否可以仅通过编写 debian/rules 来编译两次并构建单独的软件包?
- GC/C++ 从编译中省略了 main,在单独的文件中提供 main
- 将 .NET C# 程序集成到已编译(非托管)C++程序中(无需执行单独的.exe文件)
- 当我单独编译并链接时,函数的性能为什么会有所不同
- C++单独编译,不同源文件使用相同函数
- 无法从单独的.cpp使用模板化成员编译/链接类
- 使用单独的Boost库进行编译,无需安装Boost
- 将模板代码分解为单独的编译单元
- C++ - 这个单独的编译代码有什么问题?
- 如何在 Linux 中的单独/包含目录中编译额外/更新的库以及新程序
- 将多个C++文件编译在一起而不是单独编译
- 使用 IsWow64Process 而不是单独编译
- C++单独编译
- Makefile,将目录中的所有cpp文件编译为单独的可执行文件
- 在单独的文件夹中编译对象,隐式规则不匹配
- Rust中泛型的单独编译