Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在cmake中构建共享对象时指定目标链接库_Cmake - Fatal编程技术网

在cmake中构建共享对象时指定目标链接库

在cmake中构建共享对象时指定目标链接库,cmake,Cmake,我的项目创建了一个“依赖”的共享对象a,它应该引用其他共享对象B、C、D和E。在构建项目并使用实用工具ldd检查构建后,我看不到对共享对象B、C、D和E的引用。但是,当我使用指令target\u link\u库(a、B、C、D、E)时在我的构建中,对共享对象的引用出现在A.so中。我的问题有两个: 以这种方式使用target\u link\u库是否正确 如果是这样,考虑到我正在构建一个运行时链接所在的共享对象,为什么使用target\u link\u库是正确的 示例: 我的Frobnigato

我的项目创建了一个“依赖”的共享对象a,它应该引用其他共享对象B、C、D和E。在构建项目并使用实用工具
ldd
检查构建后,我看不到对共享对象B、C、D和E的引用。但是,当我使用指令
target\u link\u库(a、B、C、D、E)时
在我的构建中,对共享对象的引用出现在
A.so
中。我的问题有两个:

  • 以这种方式使用
    target\u link\u库是否正确
  • 如果是这样,考虑到我正在构建一个运行时链接所在的共享对象,为什么使用
    target\u link\u库
    是正确的

  • 示例

    我的Frobnigator项目依赖于已经构建的ContinuumTransfunction和Transmogrifier共享对象。我的问题是关于行
    target\u link\u 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?
    

    是的,即使在创建共享库时,也需要使用
    目标链接库

    虽然一些符号解析是在运行时(加载时)执行的,但有些事情应该在构建时执行(链接

    主要是。。。提供应随库一起加载的库的列表。此列表“嵌入”到库文件中。dynamic loader没有其他方法可以知道应该使用您的库加载哪些其他库

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

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

    考虑到CMake应该跨平台工作,这是有道理的:在Windows上构建“共享库”时,这些引用是绝对必要的,因为创建dll时,必须链接所有引用的库。
    运行时链接的共享对象
    -链接在构建时执行。在运行时(加载时),您只解析链接<“依赖”的共享对象A应该引用其他共享对象B、C、D和E。
    -这是什么意思?这里的“视情况而定”是什么意思?也许提供一些代码会让事情变得更清楚…@Andre,但我是在Linux上构建的。我是否需要
    target\u link\u libraries
    来指定A所依赖的共享对象?这对我来说(还)毫无意义。我只是建议你使用CGube,一个跨平台的工具,CMake(和你)也必须考虑到你的CMAKLIST应该在Windows上没有问题。然后目标链接库是绝对必要的。@Tsyvarev请参阅我的编辑。关于在构建时进行链接,您提出了一个很好的观点。