【发布时间】:2019-08-17 21:18:54
【问题描述】:
我有以下设置,其中包含一个预构建的目标文件 (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 <...>)
【问题讨论】:
-
我们可以用 cmake 将
.o编译成一个静态库,然后链接到那个静态库吗?add_executable IMPORTED用于添加预先存在的可执行文件,但您可以尝试add_library( OBJECT IMPORTED)