Lau*_*tti 6 c++ linux makefile cmake
我有一个包含5个库的项目,每个库来自10个C++源文件,然后是10个依赖于库的可执行文件.每个库也取决于前一个库.在48核Ubuntu机器上使用CMake然后'make -j 50',我首先要等待每个库在10个或更少的内核上构建(大多数更少,因为一个.C文件需要几分钟才能编译),然后我的可执行文件并行构建.
我想首先在所有.C源文件上并行运行所有.Co编译(我知道如何将该列表放入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)
Run Code Online (Sandbox Code Playgroud)
liball.so目标将编译所有其他库所需的所有源,并且当您运行、等时,它应该打破libone.so和libtwo.so源文件之间的错误依赖关系...它将最大化编译并行性跨目标。makeninja
CMake可能不够智能,无法${ONE_SRC} ${TWO_SRC}仅编译一次文件。但是,可以使用ccache来修复此问题,它将缓存预处理的文件。它的另一个好处是减少任何相同的重新编译时间。
ccache 的一个简单配置是将符号链接添加到本地 .ccache 中的 ccache 二进制文件$PATH。
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*
Run Code Online (Sandbox Code Playgroud)
ccache 环境变量相对简单。
# ccache
export CCACHE_DIR="/var/ccache/${USER}"
export CCACHE_SIZE="4G"
export CCACHE_COMPRESS="1"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
779 次 |
| 最近记录: |