【问题标题】:Why does cmake_link_libraries include static libs?为什么 cmake_link_libraries 包含静态库?
【发布时间】:2015-06-24 03:50:18
【问题描述】:

我希望我的可执行文件再次链接到共享库 (libmy_so.so),而共享库 (libmy_so.so) 又是使用静态库 (libmy_static_lib.a) 构建的。当我这样做时

target_link_libraries(my_exe my_so)

我在编译时看到 cmake 在构建行上添加了 libmy_static_lib.a。这不是我想要的,我不明白为什么需要这样做。有没有办法解决? LINK_PRIVATE 似乎没有任何区别。

我使用 CMake 2.8.9。

【问题讨论】:

    标签: c++ linker cmake shared-libraries static-libraries


    【解决方案1】:

    来自CMake documentation for target_link_libraries

    target_link_libraries(<target> [item1 [item2 [...]]]
                          [[debug|optimized|general] <item>] ...)
    

    [...] 默认情况下,使用此签名的库依赖项是可传递的。当这个目标链接到另一个目标时,链接到这个目标的库也会出现在另一个目标的链接行上。

    解决方案是使用允许手动指定传递行为的target_link_libraries 签名:

    # we explicitly state that the static lib should not propagate
    # transitively to targets depending on my_so
    target_link_libraries(my_so PRIVATE my_static_lib)
    
    # nothing has to change for the exe
    target_link_libraries(my_exe my_so)
    

    【讨论】:

    • CMake 2.8 似乎不存在 PRIVATE,并且 LINK_PRIVATE 对我不起作用。也就是说,我得到与没有 LINK_PRiVATE 相同的行为
    • @Rolle 对,这是一个至少需要 CMake 2.8.11 的功能。对于早期版本,我担心您将不得不手动处理目标属性。如果可能的话,我强烈建议您升级您的 CMake 版本。
    猜你喜欢
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    相关资源
    最近更新 更多