在为我的新玩具编译一些插件(在Linux上的gcc / g ++上)时,我遇到了这个错误:
在制作共享对象时,不能使用重定位R_X86_64_32;用-fPIC重新编译
我基本上理解why PIC is needed但是,在CMake系统中,solution seems to be this:
IF (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
SET_TARGET_PROPERTIES (${PLUGIN_BASE_LIB} PROPERTIES COMPILE_FLAGS "-fPIC")
ENDIF (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
我不明白为什么这个解决方案是有条件的。
follow-up似乎表明-fPIC基本上应该在除32位Linux之外的任何地方使用,这表明上述内容不可移植。
我应该一直使用-fPIC吗?会有任何不良影响吗?
${PLUGIN_BASE_LIB}
需要静态链接到主可执行文件,静态链接各种共享库。
答案 0 :(得分:0)
理想情况下,您想要构建两个版本的代码:一个用于主可执行文件,一个用于库。第一个需要使用-fPIE
(在现代发行版中是默认设置)进行编译,第二个需要使用-fPIC
进行编译。如您所指出的,这不取决于目标体系结构。
您只能使用-fPIC
编译一个版本,但是主可执行文件将不是最佳选择,因为-fPIC
会强制编译器遵守符号插入规则,这大大限制了其优化代码的能力例如内联和克隆功能。