首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将CMake构建的库链接到预构建的对象文件

将CMake构建的库链接到预构建的对象文件
EN

Stack Overflow用户
提问于 2019-03-27 10:27:26
回答 1查看 2.1K关注 0票数 1

下面的设置包含一个预构建的对象文件(payload.o)和4个库-- lib1lib2lib3lib4 --它们都是由这个cmake项目构建的。

代码语言:javascript
运行
复制
prebuilt/
--- payload.o
lib1/
--- CMakeLists.txt
--- src/
--- ...
lib2/
--- CMakeLists.txt
--- src/
lib34/
--- Makefile
--- src1/
--- src2/

payload.o是一个预先构建的对象,它是提供的,不能在这个cmake项目中构建。

lib1lib2cmake感知库,lib3lib4是通过Makefile (add_custom_command())生成的。

lib2依赖于lib1符号,lib3依赖于lib2lib1依赖于lib3,而lib4依赖于lib3。如您所见,这是一个循环依赖关系图。

此外,payload.o依赖于lib3lib4

因此,我试图实现的链接器调用是:

ld prebuilt/payload.o -L <cmake build directory here> --start-group lib1 lib2 lib3 --end-group lib4

我尝试通过以下方法添加预构建的对象文件:

代码语言:javascript
运行
复制
add_executable(payload IMPORTED prebuilt/payload.o)
target_link_libraries(payload lib1 lib2 lib3 lib4)

但是这个错误消息失败了。

代码语言:javascript
运行
复制
Cannot specify link libraries for target "payload" which is not built by this project

有什么想法吗?

问题中的缩写cmake文件:

代码语言:javascript
运行
复制
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 <...>)
EN

回答 1

Stack Overflow用户

发布于 2019-03-27 10:35:00

只需移除进口:

代码语言:javascript
运行
复制
add_executable(payload prebuilt/payload.o)

cmake应该知道该怎么做。IMPORTED用于cmake之外的可执行构建。

或者,您可以指定导入的对象库,因为这正是您所拥有的--一个由外部实体构建的对象文件:

代码语言:javascript
运行
复制
# 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})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55374966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档