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

to94eoyn  于 2022-11-11  发布在  其他
关注(0)|答案(2)|浏览(273)

问题:

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

提前感谢!

s3fp2yjn

s3fp2yjn1#

是的,target_link_libraries是 * 设置链接器标志 * 或链接器选项的正确方法。
target_link_libraries的文档:
指定链接给定目标时要使用的库或 * 标志 *。
以-开头的项名称(而不是-l或-framework)被视为链接器标志。
https://cmake.org/cmake/help/latest/command/target_link_libraries.html(重点不在原文)

omhiaaxx

omhiaaxx2#

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

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

相关问题