how to add prebuilt object files to executable in cmake

You can list object files along sources in add_executable() and addlibrary():

add_executable(myProgram
   source.cpp
   object.o
)

The only thing is that you need to use add_custom_command to produce object files, so CMake would know where to get them. This would also make sure your object files are built before myProgram is linked.


SET(OBJS
  ${CMAKE_CURRENT_SOURCE_DIR}/libs/obj.o
)

ADD_EXECUTABLE(myProgram ${OBJS} <other-sources>)

SET_SOURCE_FILES_PROPERTIES(
  ${OBJS}
  PROPERTIES
  EXTERNAL_OBJECT true
  GENERATED true
)

That worked for me. Apparently one must set these two properties, EXTERNAL_OBJECT and GENERATED.


I've done this in my projects with target_link_libraries():

target_link_libraries(
    myProgram 
    ${CMAKE_CURRENT_SOURCE_DIR}/libs/obj.o
)

Any full path given to target_link_libraries() is assumed a file to be forwarded to the linker.


For CMake version >= 3.9 there are the add_library(... OBJECT IMPORTED ..) targets you can use.

See Cmake: Use imported object


And - see also the answer from @arrowd - there is the undocumented way of adding them directly to your target's source file list (actually meant to support object file outputs for add_custom_command() build steps like in your case).

Tags:

Cmake