I have an add_custom_target
that triggers a make for a project (that project does not use cmake!) and generates an object file. I would like to add this object file to an executable target in my project's cmake. Is there a way to do this?
问题:
回答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
)
That worked for me. Apparently one must set these two properties, EXTERNAL_OBJECT and GENERATED.
回答2:
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).
回答3:
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.