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

DA-*_*A-- 16 c++ gcc g++ cmake static-linking

问题:

我在我的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")
Run Code Online (Sandbox Code Playgroud)

和使用

set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")
Run Code Online (Sandbox Code Playgroud)

但这不起作用.什么的工作是这样的CMake的脚本:

add_library(myLib SHARED ${SOURCE_FILES})
set(CMAKE_EXE_LINKER_FLAGS " -static")
target_link_libraries(myLib -static-libgcc -static-libstdc++)
Run Code Online (Sandbox Code Playgroud)

这一定是错误的做法,据我所知-static-libgcc和-static-libstdc ++是链接器选项而不是库......

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

提前致谢!

Spa*_*Bot 14

是的,target_link_libraries设置链接器标志或链接器选项的正确方法.

文件target_link_libraries:

指定链接给定目标时要使用的库或标志.

以 - ,但不是-l或-framework开头的项目名称被视为链接器标志.

https://cmake.org/cmake/help/v3.0/command/target_link_libraries.html(重点不是原文)

  • 谢谢!好吧,我应该更好地阅读手册...我认为 target_link_libraries 这个名称有点令人困惑... (2认同)

sol*_*ngJ 8

从 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...] ...])
Run Code Online (Sandbox Code Playgroud)

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

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

target_link_libraries(<target>
  <PRIVATE|PUBLIC|INTERFACE> <item>...
  [<PRIVATE|PUBLIC|INTERFACE> <item>...]...)
Run Code Online (Sandbox Code Playgroud)

根据您是否希望将这些库传播到相关目标,有一些不同的签名,因此请务必检查文档。

  • 为什么你不能只显示确切的代码......会容易得多...... (5认同)
  • `target_link_options(myLib PRIVATE -static-libgcc -static-libstdc++)` (5认同)