当我在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}需要静态链接到主可执行文件和各种插件的共享库中。
-fPIC
会引入显著的性能损失,因为编译器不再能够内联和克隆函数(因为它假定必须保留符号交换语义)。 - yugr