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

时间:2016-08-01 08:22:05

标签: c++ gcc cmake g++ static-linking

问题:

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

附加条件:

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

当我从this博客派生这个post时,我尝试使用以下方法将静态链接与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 个答案:

答案 0 :(得分:10)

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

target_link_libraries的文档:

  

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

     

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

https://cmake.org/cmake/help/v3.0/command/target_link_libraries.html(强调不是原创)

答案 1 :(得分:2)

从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>...]...)

有几种不同的签名,具体取决于您是否希望将这些库传播到相关的目标,因此请务必检查文档。

相关问题