c++ - fno-exceptions 和 POSITION INDEPENDENT CODE 的交互

标签 c++ cmake shared-libraries

我在构建动态库时遇到了一个相当奇怪的问题。以下是一个小例子的详细信息:
一个名为 static.h 的简单文件其内容是:

#pragma once

#include <string>

std::string static_speak();
static.cpp看起来像这样:
#include "static.h"

std::string static_speak() {
  return "I am static";
}
可以使用这两个文件(使用 cmake)构建一个静态库:
add_library(static
  static.cpp
)
现在,考虑另一个名为 shared.cpp 的文件其内容是:
#include "static.h"

std::string dynamic_speak() {
  return static_speak() + " I am dynamic";
}
可以尝试构建一个动态库(再次使用 cmake):
add_library(shared SHARED
  shared.cpp
)
target_link_libraries(shared PRIVATE
  static
)
当尝试构建上述内容时,将遇到以下错误:
[4/4] Linking CXX shared library libshared.so
FAILED: libshared.so
: && /opt/vatic/bin/clang++ -fPIC -g   -shared -Wl,-soname,libshared.so -o libshared.so CMakeFiles/shared.dir/shared.cpp.o  libstatic.a && :                                 
/usr/bin/ld: libstatic.a(static.cpp.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC                    
/usr/bin/ld: final link failed: Nonrepresentable section on output
clang-10: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
这是有道理的。我们没有编译 staticPOSITION_INDEPENDENT_CODE .这很容易通过以下方式修复:
add_library(static
  static.cpp
)
set_target_properties(static
  PROPERTIES
  POSITION_INDEPENDENT_CODE ON
)
现在编译时一切正常shared图书馆。
现在问题来了。假设我没有启用 POSITION_INDEPENDENT_CODE而是在我的代码中禁用异常(!):
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")
现在当我尝试编译 shared ,一切仍然有效!!
异常和 fPIC 如何相互关联?
这是一个重现问题的 repo :
https://github.com/skgbanga/shared

最佳答案

How are exceptions and fPIC related to each other?


他们不是(大部分)。
会发生什么是编译 -fno-exceptions更改重定位(不再引用某些与异常相关的数据),因此,没有导致链接时错误的重定位。
您可以通过使用和不使用 -fno-exceptions 的构建来确认这一点。 ,并比较 objdump -dr CMakeFiles/static.dir/static.cpp.o 的输出.
附言我无法使用 g++ (Debian 9.3.0-8) 重现您的问题,因为它默认使用 -fPIE 构建,并且两个链接都成功。
如果我添加 -fno-pie ,那么两个链接都会以相同的方式失败。

关于c++ - fno-exceptions 和 POSITION INDEPENDENT CODE 的交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63006589/

相关文章:

c++ - SetWindowsHookEx() ,钩子(Hook)不维护? (可能)

c++ - 使用 STL sort() 对 char 指针进行排序

android - 意外的 e_type : 1 Linking release library using JNI + CMake + Android. mk

cmake - 如何设置 CMAKE_INSTALL_RPATH 多个目录?

linux - 如何配置应用程序默认使用旧版本的库

c++ - 修复 linux 中缺少的 boost 共享库

c++ - 使用 QGLWidget 作为 QGraphicsView 的视口(viewport)导致黑屏

c++ - “SalesTaxPct”未在此范围内声明

c++ - cmake无法生成共享库,但是生成了静态库

c - 欺骗 libdc1394