【问题标题】:CMake: Linking statically against libgcc and libstdc++ into a shared libraryCMake:将 libgcc 和 libstdc++ 静态链接到共享库中
【发布时间】:2016-12-06 06:01:44
【问题描述】:

问题:

我在安装 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++?

提前致谢!

【问题讨论】:

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


    【解决方案1】:

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

    target_link_libraries的文档:

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

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

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

    【讨论】:

    • 谢谢!好的,我应该更好地阅读手册...我认为 target_link_libraries 这个名称有点令人困惑...
    【解决方案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>...]...)
    

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

    【讨论】:

    • 你为什么不能只显示确切的代码...会容易得多..
    • target_link_options(myLib PRIVATE -static-libgcc -static-libstdc++)
    猜你喜欢
    • 2020-06-17
    • 2015-10-08
    • 1970-01-01
    • 2020-12-17
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    相关资源
    最近更新 更多