为什么cmake_link_libraries包含静态库

Why does cmake_link_libraries include static libs?

本文关键字:静态 包含 link cmake 为什么 libraries      更新时间:2023-10-16

我希望我的可执行文件再次链接共享库(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。

来自 CMake 文档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)