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

问题描述 投票:0回答:2

问题:

我在使用 CMake 和 GCC4.9 在我的 Ubuntu 16.04 安装上将 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")

但这不起作用。 does 工作的是这个 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++ 进行静态链接?

提前致谢!

c++ gcc cmake g++ static-linking
2个回答
19
投票

是的,

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

target_link_libraries
的文档:

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

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

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


6
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.