下面的设置包含一个预构建的对象文件(payload.o)和4个库-- lib1、lib2、lib3和lib4 --它们都是由这个cmake项目构建的。
prebuilt/
--- payload.o
lib1/
--- CMakeLists.txt
--- src/
--- ...
lib2/
--- CMakeLists.txt
--- src/
lib34/
--- Makefile
--- src1/
--- src2/payload.o是一个预先构建的对象,它是提供的,不能在这个cmake项目中构建。
lib1和lib2是cmake感知库,lib3和lib4是通过Makefile (add_custom_command())生成的。
lib2依赖于lib1符号,lib3依赖于lib2,lib1依赖于lib3,而lib4依赖于lib3。如您所见,这是一个循环依赖关系图。
此外,payload.o依赖于lib3和lib4。
因此,我试图实现的链接器调用是:
ld prebuilt/payload.o -L <cmake build directory here> --start-group lib1 lib2 lib3 --end-group lib4
我尝试通过以下方法添加预构建的对象文件:
add_executable(payload IMPORTED prebuilt/payload.o)
target_link_libraries(payload lib1 lib2 lib3 lib4)但是这个错误消息失败了。
Cannot specify link libraries for target "payload" which is not built by this project有什么想法吗?
问题中的缩写cmake文件:
project(...)
# build lib1/lib2
add_subdirectory(lib1)
add_subdirectory(lib2)
# add custom command & target
add_custom_command(
OUTPUT
"${LIB3} ${LIB4}"
COMMAND
...
VERBATIM
)
add_custom_target(lib34 DEPENDS "${LIB3} ${LIB4}")
add_dependencies(lib34 lib2)
add_library(lib3 STATIC IMPORTED ${LIB3})
add_dependencies(lib3 lib34)
add_library(lib4 STATIC IMPORTED ${LIB4})
add_dependencies(lib4 lib34)
# lib1 -> lib3
add_dependencies(lib1 lib3)
# payload target
add_executable(payload IMPORTED
prebuilt/payload.o
)
add_dependencies(payload lib3 lib4)
target_link_libraries(payload lib1 lib2 lib3 lib4 <...>)发布于 2019-03-27 10:35:00
只需移除进口:
add_executable(payload prebuilt/payload.o)cmake应该知道该怎么做。IMPORTED用于cmake之外的可执行构建。
或者,您可以指定导入的对象库,因为这正是您所拥有的--一个由外部实体构建的对象文件:
# import .o file as object library
add_library(payload_object OBJECT IMPORTED GLOBAL)
set_target_properties(payload_object IMPORTED_OBJECTS ${CMAKE_CURRENT_SOURCE_DIR}/prebuilt/payload.o
# create payload executable, add payload objects
add_executable(payload ${TARGET_OBJECTS:payload_object})https://stackoverflow.com/questions/55374966
复制相似问题