CMake:将libgcc和libstdc++静态链接到一个共享库中

27

问题:

我在我的Ubuntu 16.04安装中使用CMake和GCC4.9链接glibcc/glibc++到共享库时遇到了困难。

其他条件:

加载共享库会在Red Hat生产环境中(我将其复制到该环境中)出现问题,我认为这是因为它使用了不同的libstc++版本(错误:未找到GLIBCXX_3_4_20)。我没有sudo权限,无法升级机器。

正如我从这篇博客,这个帖子中得出的结论,我尝试使用静态链接来链接libgcc和libgc++:

set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")

再次使用

set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")

但那并不起作用。 确实 起作用的是这个 CMake 脚本:

add_library(myLib SHARED ${SOURCE_FILES})
set(CMAKE_EXE_LINKER_FLAGS " -static")
target_link_libraries(myLib -static-libgcc -static-libstdc++)

据我所知,-static-libgcc和-static-libstdc++是链接器选项而不是库,在我的了解中,这种做法可能是错误的...

问题: 如何正确地静态链接 -libgcc 和 -libstdc++?

提前感谢!

2个回答

19

是的,target_link_libraries 是设置链接器标识符或链接器选项的正确方式。

target_link_libraries 的文档:

指定在链接给定目标时使用的库或者标识符

以-开头但不是-l或-framework的项会被视为链接器标识符。

https://cmake.org/cmake/help/latest/command/target_link_libraries.html(其中的强调不是原文)


1
谢谢!好的,我应该更好地阅读手册...我认为target_link_libraries这个名称有点令人困惑... - DA--

7
自 cmake 3.13 起,有一个新的 cmake 函数用于一般链接器选项:

https://cmake.org/cmake/help/v3.13/command/target_link_options.html

target_link_options(<target> [BEFORE]
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

适当的指定需要链接的库的方式仍然是:

https://cmake.org/cmake/help/v3.13/command/target_link_libraries.html

target_link_libraries(<target>
  <PRIVATE|PUBLIC|INTERFACE> <item>...
  [<PRIVATE|PUBLIC|INTERFACE> <item>...]...)

根据是否希望这些库传播到依赖目标,有几种不同的签名,请务必查阅文档。


5
为什么你不能直接展示准确的代码呢……这样会更容易。 - AntonioCS
5
target_link_options(myLib PRIVATE -static-libgcc -static-libstdc++) - jpihl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接