How to build object files only once with cmake?

Viewed 18091

I have a CMakeLists.txt file that looks like this:

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)

The source1.o source2.o source3.o files take a really long time to build, and since they are common to all the executables, I want each of them to be built only once. The current behavior for cmake, however, is to rebuild them for each exec target separately, which is an unnecessary duplication of effort.

Is there a way to tell cmake to build object files only once?

3 Answers

Yes, in CMake 2.8.8 you can use an object library, which is a kind of virtual library that has the same organizational and dependency properties of a real static or shared library, but does not produce a file on disk. See CMake Tutorials: Object Library.

In recent CMake versions, you can use an object library. It will mostly behave like any libraries but won't archive it into a static library:

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

You can then "link" it to other targets:

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)
Related