CMake:针对libgcc和libstdc++静态链接到共享库中
CMake: Linking statically against libgcc and libstdc++ into a shared library
问题:
在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>...]...)
根据您是否希望将这些库传播到依赖目标,有一些不同的签名,因此请务必检查文档。
- 链接共享库依赖项未在 ldd 中列出
- Gradle cpp 插件不链接共享库
- 从大型 github 项目链接共享库
- 如何在工具ROS中链接共享库
- Linux C++.链接共享对象和主对象
- 共享对象与提升program_options静态链接;应用程序链接共享
- G++ 5.5 不链接共享库
- 根据用户配置在运行时链接共享对象
- 在静态库中链接失败,但链接共享库成功
- G 无法链接共享对象的静态版本
- 仅当标头在 CMake 中更改时,才重新链接共享库
- 动态链接共享库中的全局变量和静态变量会发生什么情况
- CMake:从外部项目链接共享C++对象会生成具有相对路径的二进制文件,而不是绝对路径
- 在VirtualBox的共享文件夹中构建符号链接共享库
- 编译对象后链接共享库时出错
- 如何通过GNU Autotools链接共享库
- 如何以正确的方式编译和链接C/ c++共享对象库
- 无法链接共享对象
- 在 R 包中生成和链接共享库 - 代码编译、链接,但不会加载
- 如何在cmake中链接共享对象