如何使用cmake只构建一次目标文件?

dzh*_*lil 18 cmake

我有一个CMakeLists.txt文件,如下所示:

add_executable(exec1 exec1.c source1.c source2.c source3.c)
add_executable(exec2 exec2.c source1.c source2.c source3.c)
add_executable(exec3 exec3.c source1.c source2.c source3.c)
Run Code Online (Sandbox Code Playgroud)

source1.o source2.o source3.o文件需要很长时间才能构建,因为它们对于所有可执行文件都是通用的,所以我希望它们中的每一个都只构建一次.但是,cmake的当前行为是分别为每个exec目标重建它们,这是不必要的重复工作.

有没有办法告诉cmake只构建一次目标文件?

Jes*_*erE 15

不会.这很难实现,因为源文件可以使用不同的编译器选项,构建后的步骤等进行编译.

你可以做的是将目标文件放入静态库并与之链接:

add_library(mylib STATIC source1.c source2.c)
add_executable(myexe source3.c)
target_link_libraries(myexe mylib)
Run Code Online (Sandbox Code Playgroud)

编辑:当然,您也可以将它放在共享库中.

  • 注意这种方法.如果涉及到很多exes,共享库可能会更友好http://blog.flameeyes.eu/2008/01/21/what-to-do-with-shared-code (3认同)
  • 当然是.我想我只是假设OP想要在每个可执行文件中复制代码. (2认同)

mab*_*ham 15

是的,在CMake的2.8.8,您可以使用一个对象库,这是一种具有真正的静态或共享库的相同的组织和依赖属性虚拟库,但不会产生磁盘上的文件.请参阅CMake教程:对象库.


Gui*_*cot 5

在最近的 CMake 版本中,您可以使用对象库。它的行为与任何库一样,但不会将其存档到静态库中:

add_library(my_cpps OBJECT a.cpp b.cpp c.cpp)
Run Code Online (Sandbox Code Playgroud)

然后,您可以将其“链接”到其他目标:

add_library(my_lib1 d.cpp e.cpp f.cpp)
target_link_libraries(my_lib1 PUBLIC my_cpps)

add_library(my_lib2 f.cpp g.cpp h.cpp)
target_link_libraries(my_lib2 PUBLIC my_cpps)
Run Code Online (Sandbox Code Playgroud)