在cmake中构建共享对象时指定target_link_libraries

时间:2017-04-11 09:24:06

标签: cmake

我的项目创建了一个共享对象'依赖'应该引用其他共享对象B,C,D和E.在构建项目并使用实用程序ldd检查构建之后,我看不到对共享的引用对象B,C,D和E.但是,当我在构建中使用指令target_link_libraries(A , B , C , D , E )时,对共享对象的引用显示在A.so中。我的问题有两个:

  1. 以这种方式使用target_link_libraries是否正确?
  2. 如果是这样,为什么这个target_link_libraries的使用是正确的,因为我正在构建一个在运行时链接的共享对象。
  3. 示例

    我的Frobnigator项目取决于已构建的ContinuumTransfunctioner和Transmogrifier共享对象。我的问题是关于行target_link_libraries(Frobnigator ${Libraries})是否必要。

    cmake_minimum_required(VERSION 3.0)
    
    set(Libraries
        ContinuumTransfunctioner
        Transmogrifier
    )
    
    set(SourceFiles
        Wrapper.cpp
        Logger.cpp
    )
    
    add_library(Frobnigator SHARED ${SourceFiles})
    add_library(FrobnigatorStatic STATIC ${SourceFiles})
    set_target_properties(FrobnigatorStatic PROPERTIES OUTPUT_NAME Frobnigator)
    #target_link_libraries(Frobnigator ${Libraries}) # Do I need this?
    

1 个答案:

答案 0 :(得分:2)

是的,即使在创建 SHARED 库时也需要使用target_link_libraries

虽然在运行时 loading 时间)执行某些符号解析,但有些事情应该在构建时执行)。

主要的是......提供一个库列表,这些库应该加载到您的库中。此列表是"嵌入"进入库文件。 动态加载程序没有其他方法可以知道应该加载哪些库。

在链接时执行的其他事项包括:

  • 检查您的库所需的所有符号在其他库中实际可用