как добавить готовые объектные файлы к исполняемому в cmake

У меня есть add_custom_target который запускает make для проекта (этот проект не использует cmake!) И генерирует объектный файл. Я хотел бы добавить этот объектный файл к исполняемой цели в моем проекте cmake. Есть ли способ сделать это?

Ответы

Ответ 1

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
)

Это сработало для меня. По-видимому, необходимо установить эти два свойства, EXTERNAL_OBJECT и GENERATED.

Ответ 2

Я сделал это в своих проектах с помощью target_link_libraries():

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

Любой полный путь, заданный для target_link_libraries() считается файлом, который должен быть перенаправлен в компоновщик.


Для версии CMake> = 3.9 есть add_library(... OBJECT IMPORTED..) вы можете использовать.

См. Cmake: использование импортированного объекта


И - см. Также ответ от @arrowd - есть недокументированный способ добавления их непосредственно в список целевых исходных файлов (фактически предназначенный для поддержки выходов объектных файлов для add_custom_command() сборки add_custom_command() как в вашем случае).

Ответ 3

Вы можете перечислить объектные файлы по источникам в add_executable() и addlibrary():

add_executable(myProgram
   source.cpp
   object.o
)

Единственное, что вам нужно использовать add_custom_command для создания объектных файлов, поэтому CMake будет знать, где их получить. Это также гарантирует, что ваши объектные файлы будут созданы до того, как myProgram будет связан.