CMAKE中添加-fPIC编译器选项的惯用方式是什么?


119

我至少遇到了3种方法来做,我想知道哪种是惯用的方法。几乎所有静态库都需要这样做。我很惊讶CMake中的Makefile生成器没有自动将其添加到静态库中。(除非我想念什么?)

target_compile_options(myLib PRIVATE -fPIC)

add_compile_options(-fPIC)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")

我相信可能还会有其他变化。(如果找到一个,请编辑我的问题)

如果您碰巧知道此问题的答案,您是否还知道是否有一种方法可以使第三方CMake项目使用此标志进行编译,而无需修改其CMakeLists.txt文件?我遇到了缺少该标志的静态库。在将静态库编译为动态库时会引起问题。

你得到:

relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")对我有用。
梭子鱼

Answers:


179

您可以在所有目标上设置与位置无关的代码属性:

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

或在特定的库中:

add_library(lib1 lib1.cpp)
set_property(TARGET lib1 PROPERTY POSITION_INDEPENDENT_CODE ON)

参考:CMAKE_POSITION_INDEPENDENT_CODE cmake构建系统


第二种方法似乎也是将其添加到第三方库中的正确方法。完善。
010110110101 '16

Hrm-我想知道如何将其添加到由ExternalProject_Add添加的项目中?
010110110101 '16

2
@ 010110110101我不知道它是否有效,但您可以尝试在ExternalProject_Add中指定选项CMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
Amadeus

12
CMAKE_POSITION_INDEPENDENT_CODE默认情况下,为SHARED目标设置该属性,无需显式设置。
罗伯特,2013年

1
@Carbon(如果使用set命令)(上面的第一个版本),则否。如果您使用的是第二个版本,则是每个库而不是每个目录。
patrickvacek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.