c++ - 为什么在构建依赖库之前目标可执行文件的编译还没有开始?

标签 c++ makefile cmake

我已经建立了一个 CMake 项目 (3.1),其中包含一个可执行文件 E1 和两个静态库 L1 和 L2。

所有三个目标都需要编译几个 cpp 文件。 通过 target_link_libraries(E1 L1 L2) E1 链接到两个库,当然,在链接 E1 之前,需要构建 L1 和 L2。

但是使用 makefile-backend 和并行构建 (make -j),E1 的 cpp 文件的编译甚至不会在 L1 和 L2 静态链接之前开始 - 无论我是否使用 -j8或 -j256。

我可以通过 CMake 指定一些东西来确保 E1 的单元已经编译,即使任何依赖库的(单线程)链接仍在继续吗?

类似问题: CMake adds unnecessary dependencies between .o and .a files . 他们的解决方案是消除链接依赖性或引入新的库层。 对于我的情况,这意味着将 E1 的 cpp 文件包装到一个单独的目标(STATIC 或 OBJECT)L-E1 中并链接到实际 E1 中的目标。 但是就没有别的办法了吗?

最佳答案

我目前的解决方案是添加一个中间体 object-library (CMake >= 2.8.8)。

所以下面的脚本不会启动 E1 的编译单元的编译:

add_executable(E1 main.cpp logging.cpp ui.cpp)
target_link_libraries(E1 L1 L2)

替换为:

add_library(E1_OBJECTS OBJECT main.cpp logging.cpp ui.cpp)
add_executable(E1 $<TARGET_OBJECTS:E1_OBJECTS>)
target_link_libraries(E1 L1 L2)

这样,cpp 文件将尽早编译,无需等待链接到 E1 的库 L1 和 L2。

当然,任何编译时依赖项都需要转移到新目标 E1_OBJECTS。

关于c++ - 为什么在构建依赖库之前目标可执行文件的编译还没有开始?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28152398/

相关文章:

c++ - 如何确定要为体系结构启用或禁用的功能标志

c++ - 从 std `vector` 库创建的 `<vector>` 和从 : `STL vector` 创建的 `<STL_vector.h>` 之间的区别

c++ - CMAKE 找到包但不链接库

c++ - 包含字符串和整数的文件输入

c - 您需要在 makefile 中包含头文件吗?

java - 现代的 javadeps 等价物?

makefile - 匹配具有依赖性的任何模式规则

cmake - 在最新的 CMAKE 中找不到 CUDA_INCLUDE_DIRS

c++ - CMake 和 Clang 工具链接错误(树外)

c++ - 如何将重复的句柄传递给子进程?