V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
stebest
V2EX  ›  C++

关于 CMAKE 的链接库

  •  
  •   stebest ·
    newdee · 2020-09-16 16:30:05 +08:00 · 2136 次点击
    这是一个创建于 1529 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想问一下,如果 cmake 生成了一个库文件,比如动态库(so),设为 A.so, 然后生成的过程中依赖了其他的库,就算 B.so, 即最后使用 target link 连接上去,那么生成的库 A.so 被别的程序使用的时候也还是要再次连接 B.so 吗?

    目前遇到的问题就是这样,是不是 cmake 写的有问题,编译打包好了的库,在给别的程序使用的时候,如果不提供原来的头文件和库,就会提示 undefined request 的错误

    6 条回复    2020-10-09 00:51:40 +08:00
    wutiantong
        1
    wutiantong  
       2020-09-16 16:32:05 +08:00   ❤️ 1
    建议了解一下动态链接库和静态链接库的区别。
    Huelse
        2
    Huelse  
       2020-09-16 16:39:07 +08:00   ❤️ 1
    不知道你在说什么,动态库只有程序运行时被调用,静态库在编译时被包含。
    stebest
        3
    stebest  
    OP
       2020-09-16 16:53:23 +08:00
    @Huelse 就是以前的代码生成的库,如果是动态的,然后你编译的时候需要调用,同时包含其头文件。然后生成的库被别人调用的时候也还是要包含你之前包含的头文件和链接库么?
    stebest
        4
    stebest  
    OP
       2020-09-16 16:57:38 +08:00
    @Huelse 大概明白了,谢谢
    EggtartZ
        5
    EggtartZ  
       2020-09-16 17:06:51 +08:00   ❤️ 1
    target_link_libraries 可以设置成 PRIVATE
    cnt2ex
        6
    cnt2ex  
       2020-10-09 00:51:40 +08:00   ❤️ 1
    根据你 A.so 的接口(头文件里)是不是也暴露了 B.so 的东西而定。如果你 A 暴露了 B 的东西,新的库 C 连接 A 的时候是需要知道哪里去找 B 的那部分东西的,这时就得给 C 指定 B ( https://cmake.org/pipermail/cmake/2016-May/063400.html

    cmake 里有 public 、private 、interface 这几个东西可以帮你处理这种依赖

    如果 A 暴露了 B 的话,你 target_link_libraries 的时候把 B.so 的依赖设为 PUBLIC: target_link_libraries(A PUBLIC B)
    如果不是的话,设置为 PRIVATE 。
    当设置成 PUBLIC 之后,新的 C 连接 A 的时候,cmake 会把 A 的依赖传给 C,你就不需要额外给 C 设置 target_link_libraries 到 B 了( https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#transitive-usage-requirements

    不过如果你的 A.so 不是 cmake 生成,而是外面导入的话,还是得手动设置这种依赖。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   959 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 20:32 · PVG 04:32 · LAX 12:32 · JFK 15:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.