为什么在创建特定于x86_64的共享对象时“无法使用R_X86_64_32”的CMake解决方案?

时间:2014-06-08 19:22:46

标签: gcc cmake portability

在为我的新玩具编译一些插件(在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}需要静态链接到主可执行文件,静态链接各种共享库。

1 个答案:

答案 0 :(得分:0)

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

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

相关问题