我有一个包含5个库的项目,每个库来自10个C ++源文件,然后是10个依赖于库的可执行文件。每个库也取决于前一个库。在48核Ubuntu机器上使用CMake然后'make -j 50',我首先要等待每个库在10个或更少的内核上构建(大多数更少,因为一个.C文件需要几分钟才能编译),然后我的可执行文件并行构建。
我想首先在所有.C源文件上并行运行所有.Co编译(我知道如何将该列表放入CMake变量中),然后按依赖项指定的顺序仅运行链接器。 / p>
有没有办法用CMake做到这一点,例如通过设置假目标或类似的东西? (我只想重新编译已修改的.C文件。)
答案 0 :(得分:1)
执行此操作的方法是添加一个错误目标,其中包含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的简单配置是将符号链接添加到本地$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"
答案 1 :(得分:0)
在 linux 上使用 ninja 构建生成器为我解决了这个问题(2021 年):
> cmake -G Ninja <path-to-source>
> ninja
好像makefile生成器添加了太多依赖...