c++ - cmake force parallel .C.o 链接前编译

标签 c++ linux makefile cmake

我有一个包含 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 当您运行 makeninja 等...它将最大化目标之间的编译并行性。

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/

相关文章:

c++ - 在 C++ 中确保单个实例但不是全局实例的最佳方法

c++ - 如何在 Cascades、Blackberry 10 中使用 Qt/QML/C++ 从另一个 qml 文件更改一个 qml 文件中的标签文本?

linux - 如何在 Linux 中连接两个 VCAN 端口?

makefile - 为什么我被警告项目没有使用 "CMAKE_TOOLCHAIN_FILE"变量?

ARM架构内核模块的交叉编译

c++ - visual studio下fortran和c++/c混合编程

c++ - 数组中的交替最高计数

linux - 开发 GTK+ 应用程序的好代码编辑器

linux - 测量同一 wifi 网络中其他用户的下载速度?

unix - 如何构建二进制文件并在 Unix 的多台机器上使用它?