23

我有一个 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)

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

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

4

3 回答 3

18

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

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

add_library(mylib STATIC source1.c source2.c)
add_executable(myexe source3.c)
target_link_libraries(myexe mylib)

编辑:当然,您也可以将其放入共享库中。

于 2009-09-07T11:39:54.377 回答
16

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

于 2013-11-30T11:49:41.597 回答
5

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

add_library(my_cpps OBJECT a.cpp b.cpp c.cpp)

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

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)
于 2019-02-19T15:28:25.680 回答