V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
stebest
V2EX  ›  C++

关于 CMAKE 的链接库

  •  
  •   stebest ·
    newdee · Sep 16, 2020 · 2681 views
    This topic created in 2058 days ago, the information mentioned may be changed or developed.

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

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

    6 replies    2020-10-09 00:51:40 +08:00
    wutiantong
        1
    wutiantong  
       Sep 16, 2020   ❤️ 1
    建议了解一下动态链接库和静态链接库的区别。
    Huelse
        2
    Huelse  
       Sep 16, 2020   ❤️ 1
    不知道你在说什么,动态库只有程序运行时被调用,静态库在编译时被包含。
    stebest
        3
    stebest  
    OP
       Sep 16, 2020
    @Huelse 就是以前的代码生成的库,如果是动态的,然后你编译的时候需要调用,同时包含其头文件。然后生成的库被别人调用的时候也还是要包含你之前包含的头文件和链接库么?
    stebest
        4
    stebest  
    OP
       Sep 16, 2020
    @Huelse 大概明白了,谢谢
    EggtartZ
        5
    EggtartZ  
       Sep 16, 2020   ❤️ 1
    target_link_libraries 可以设置成 PRIVATE
    cnt2ex
        6
    cnt2ex  
       Oct 9, 2020   ❤️ 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 生成,而是外面导入的话,还是得手动设置这种依赖。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1060 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 22:54 · PVG 06:54 · LAX 15:54 · JFK 18:54
    ♥ Do have faith in what you're doing.