Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用cmake仅构建一次对象文件?_Cmake - Fatal编程技术网

如何使用cmake仅构建一次对象文件?

如何使用cmake仅构建一次对象文件?,cmake,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) 构建source1.o source2.o source3.o文件需要很长的时间,因

我有一个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只生成一次目标文件?

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

您可以做的是将对象文件放入静态库中,并与其链接:

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

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

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

在最近的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)

注意这个方法。如果有很多前女友参与,共享库可能会更友好是的,当然。我想,我只是假设OP需要在每个可执行文件中复制代码。如果静态/对象库编译得很慢(例如用Boost或EGIN的C++源),并且只包含少量源文件,那么这种方法可以增加并行构建的构建时间。因为在构建
mylib
之前,目标不会开始构建。在我的真实世界项目中,总构建时间的差异似乎是22秒vs 38秒(重复编译与代码>对象< /CARS>库)。如果静态/对象库编译得慢(例如,用Boost或EGIN的C++源),并且只包含少量源文件,那么这种方法可以增加并行构建的构建时间,因为在构建
mylib
之前,目标不会开始构建。在我的真实项目中,总构建时间的差异似乎是22秒与38秒(分别是重复编译与
OBJECT
library)。@Ruslan不一定。使用忍者时,即使对象库尚未完成,它也可以开始构建。我将延迟链接,直到对象库完成。