我有一个包含 5 个库的项目,每个库都来自 10 个 C++ 源文件,然后是 10 个依赖这些库的可执行文件。每个库还依赖于前一个库。使用 CMake,然后在 48 核 Ubuntu 机器上使用“make -j 50”,我首先必须等待每个库在 10 个或更少的内核上构建(大多数更少,因为一个 .C 文件需要几分钟才能编译),然后我的可执行文件是并行构建的。
我想首先在所有 .C 源文件上并行运行所有 .C.o 编译(我知道如何将该列表放入 CMake 变量),然后仅按照依赖项指定的顺序运行链接器。
有没有办法用 CMake 做到这一点,例如通过设置一个虚假目标或类似的东西? (我只想重新编译修改过的.C文件)。
最佳答案
执行此操作的一种方法是添加一个虚假目标,该目标由 CMake 中每个库目标的所有源组成。一个示例 CMakeLists.txt 可能是...
set(ONE_SRC one/a.c one/b.c)
set(TWO_SRC two/a.c two/b.c)
# pre-compile
add_library(all ${ONE_SRC} ${TWO_SRC})
add_library(one ${ONE_SRC})
add_library(two ${TWO_SRC})
add_dependencies(one all)
add_dependencies(two one)
liball.so 目标将编译所有其他库所需的所有源代码,它应该打破 libone.so 源文件和libtwo.so 当您运行 make
、ninja
等...它将最大化目标之间的编译并行性。
CMake 可能不够聪明,无法只编译一次 ${ONE_SRC} ${TWO_SRC}
文件。但是,这可以使用 ccache 修复。 ,这将缓存预处理文件。它具有减少任何相同的重新编译时间的额外好处。
ccache 的一个简单配置是将符号链接(symbolic link)添加到本地 $PATH
中的 ccache 二进制文件。
jason@io ~ $ ll ~/bin/ccache
total 0
lrwxrwxrwx 1 jason jason 15 May 12 2013 c++ -> /usr/bin/ccache*
lrwxrwxrwx 1 jason jason 15 May 12 2013 cc -> /usr/bin/ccache*
lrwxrwxrwx 1 jason jason 15 Apr 27 21:38 clang -> /usr/bin/ccache*
lrwxrwxrwx 1 jason jason 15 Apr 27 21:38 clang++ -> /usr/bin/ccache*
lrwxrwxrwx 1 jason jason 15 May 12 2013 g++ -> /usr/bin/ccache*
lrwxrwxrwx 1 jason jason 15 Oct 6 2013 gcc -> /usr/bin/ccache*
lrwxrwxrwx 1 jason jason 15 May 12 2013 x86_64-pc-linux-gnu-c++ -> /usr/bin/ccache*
lrwxrwxrwx 1 jason jason 15 May 12 2013 x86_64-pc-linux-gnu-g++ -> /usr/bin/ccache*
lrwxrwxrwx 1 jason jason 15 May 12 2013 x86_64-pc-linux-gnu-gcc -> /usr/bin/ccache*
ccache 环境变量相对简单。
# ccache
export CCACHE_DIR="/var/ccache/${USER}"
export CCACHE_SIZE="4G"
export CCACHE_COMPRESS="1"
关于c++ - cmake force parallel .C.o 链接前编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23667297/