为什么针对“在制作共享对象时无法使用R_X86_64_32”问题的CMake解决方案只适用于x86_64平台?

4

当我在Linux上使用gcc/g++编译我的新插件时,出现了以下错误:

无法在制作共享对象时使用重定位R_X86_64_32;请使用-fPIC重新编译

我基本上明白为什么需要PIC,但在CMake系统中,解决方案似乎是这样的

IF (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
    SET_TARGET_PROPERTIES (${PLUGIN_BASE_LIB} PROPERTIES COMPILE_FLAGS "-fPIC")
ENDIF (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")

我不明白为什么这个解决方案是有条件的。 后续似乎表明-fPIC应该基本上在除了32位Linux以外的所有地方使用,这表明上述内容不是可移植的。
我应该总是使用-fPIC吗?会有任何不良影响吗? ${PLUGIN_BASE_LIB}需要静态链接到主可执行文件和各种插件的共享库中。

1
除了编译器和运行时需要做更多的工作之外,我从未注意到设置-fPIC存在任何问题。通常不是问题。 - languitar
在使用mingw时,使用-fPIC和-Werror可能会导致错误(我需要检查一下,现在不在Windows上)。 - Shade
@languitar -fPIC 会引入显著的性能损失,因为编译器不再能够内联和克隆函数(因为它假定必须保留符号交换语义)。 - yugr
1个回答

0

理想情况下,您需要构建两个版本的代码:一个用于主可执行文件,另一个用于库。第一个需要使用-fPIE编译(在现代发行版中默认),第二个需要使用-fPIC编译。正如您所指出的那样,这与目标架构无关。

可以仅使用-fPIC编译一个版本,但是主可执行文件将不够优化,因为-fPIC强制编译器遵守符号交换规则,这会显著限制其优化代码的能力,例如内联和克隆函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接