CMake:针对 libgcc 和 libstdc++ 静态链接到共享库
CMake: Linking statically against libgcc and libstdc++ into a shared library
问题:
我在 Ubuntu 16.04 安装中使用 CMake 和 GCC4.9 link将 glibcc/glibc++ 放入共享库时遇到困难。
附加条件:
加载共享库在 Red Hat 生产环境(我将其复制到的位置)中出现问题,我相信是因为它使用了不同的 libstc++ 版本(错误:GLIBCXX_3_4_20 未找到)。我没有 sudo 权限,无法升级机器。
因为我是从 this blog, this post 派生出来的,所以我尝试 linking static linking 来对抗 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++ 是 linker 选项而不是库...
问题:
我如何 link 正确地静态反对 -libgcc 和 -libstdc++?
提前致谢!
是的,target_link_libraries
是设置链接器标志 或链接器选项的正确方法。
target_link_libraries
的文档:
Specify libraries or flags to use when linking a given target.
Item names starting with -, but not -l or -framework, are treated as
linker flags.
https://cmake.org/cmake/help/v3.0/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>...]...)
根据您是否希望将这些库传播到相关目标,有一些不同的签名,因此请务必查看文档。
问题:
我在 Ubuntu 16.04 安装中使用 CMake 和 GCC4.9 link将 glibcc/glibc++ 放入共享库时遇到困难。
附加条件:
加载共享库在 Red Hat 生产环境(我将其复制到的位置)中出现问题,我相信是因为它使用了不同的 libstc++ 版本(错误:GLIBCXX_3_4_20 未找到)。我没有 sudo 权限,无法升级机器。
因为我是从 this blog, this post 派生出来的,所以我尝试 linking static linking 来对抗 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++ 是 linker 选项而不是库...
问题: 我如何 link 正确地静态反对 -libgcc 和 -libstdc++?
提前致谢!
是的,target_link_libraries
是设置链接器标志 或链接器选项的正确方法。
target_link_libraries
的文档:
Specify libraries or flags to use when linking a given target.
Item names starting with -, but not -l or -framework, are treated as linker flags.
https://cmake.org/cmake/help/v3.0/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>...]...)
根据您是否希望将这些库传播到相关目标,有一些不同的签名,因此请务必查看文档。