CMake:针对libgcc和libstdc++静态链接到共享库中

CMake: Linking statically against libgcc and libstdc++ into a shared library

本文关键字:链接 共享 静态 libstdc++ 针对 libgcc CMake      更新时间:2023-10-16

问题:

在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++进行静态链接?

提前感谢!

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

target_link_libraries:文件

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

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

https://cmake.org/cmake/help/latest/command/target_link_libraries.html(强调不在原件中)

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

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