Gcc 为什么CMake解决方案适用于;创建共享对象时不能使用R_X86_64_32“;特定于x86_64?

Gcc 为什么CMake解决方案适用于;创建共享对象时不能使用R_X86_64_32“;特定于x86_64?,gcc,cmake,portability,Gcc,Cmake,Portability,我在为我的新玩具(在Linux上的gcc/g++上)编译一些插件时遇到了这个错误: 创建共享对象时不能使用重新定位R_X86_64_32;用-fPIC重新编译 我基本上理解,但在CMake系统中: 我不明白为什么这个解决方案是有条件的 这似乎表明,除了32位Linux之外,基本上所有地方都应该使用-fPIC,这表明上面提到的是不可移植的 我应该始终使用-fPIC吗?会有任何副作用吗? ${PLUGIN\u BASE\u LIB}需要静态链接到主可执行文件和作为插件的各种共享库。理想情况下,您需要

我在为我的新玩具(在Linux上的gcc/g++上)编译一些插件时遇到了这个错误:

创建共享对象时不能使用重新定位R_X86_64_32;用-fPIC重新编译

我基本上理解,但在CMake系统中:

我不明白为什么这个解决方案是有条件的

这似乎表明,除了32位Linux之外,基本上所有地方都应该使用-fPIC,这表明上面提到的是不可移植的

我应该始终使用-fPIC吗?会有任何副作用吗?


${PLUGIN\u BASE\u LIB}
需要静态链接到主可执行文件和作为插件的各种共享库。

理想情况下,您需要构建两个版本的代码:一个用于主可执行文件,另一个用于库。第一个需要使用
-fPIE
(这是现代发行版中的默认值)编译,第二个需要使用
-fPIC
编译。正如您所指出的,这并不取决于目标体系结构


您只能使用
-fPIC
编译一个版本,但主可执行文件将是次优的,因为
-fPIC
强制编译器遵守符号插入规则,这大大限制了它优化代码的能力,例如内联和克隆函数。

我从未注意到将-fPIC设置为最小值之外的任何问题编译器和运行时还有更多工作要做。通常不是问题。将-fPIC和-Werror与mingw一起使用可能会导致错误(我需要检查,现在不是在windows上)@languitar
-fPIC
引入了显著的性能损失,因为编译器不再能够内联和克隆函数(因为它假定必须保留符号插入语义)。
IF (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
    SET_TARGET_PROPERTIES (${PLUGIN_BASE_LIB} PROPERTIES COMPILE_FLAGS "-fPIC")
ENDIF (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")