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

010*_*101 89 c c++ cmake

我至少有三种方法可以做到这一点,我想知道哪种方式是惯用的.这几乎普遍适用于任何静态库.我很惊讶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")
Run Code Online (Sandbox Code Playgroud)

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

如果您碰巧知道这个问题的答案,您是否也知道是否有办法使用此标志编译第三方CMake项目而不修改其CMakeLists.txt文件?我遇到了缺少该标志的静态库.将静态库编译为动态库时会导致问题.

你得到:

relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
Run Code Online (Sandbox Code Playgroud)

Ama*_*eus 141

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

set(CMAKE_POSITION_INDEPENDENT_CODE ON)
Run Code Online (Sandbox Code Playgroud)

或在特定的图书馆:

add_library(lib1 SHARED lib1.cpp)
set_property(TARGET lib1 PROPERTY POSITION_INDEPENDENT_CODE ON)
Run Code Online (Sandbox Code Playgroud)

参考:CMAKE_POSITION_INDEPENDENT_CODE cmake构建系统

  • 默认情况下,为“ SHARED”目标设置了“ CMAKE_POSITION_INDEPENDENT_CODE”属性,无需显式设置。 (6认同)
  • @010110110101 我不知道它是否有效,但您可以尝试在 ExternalProject_Add 中指定选项`CMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"` (3认同)
  • 第二种方法似乎也是将其添加到第三方库的正确方法。完美的。 (2认同)

sca*_*cai 25

您还可以将以下命令行选项传递给cmake(以防这不是您的 cmake 项目和/或您不能或不想修改项目文件):

-DCMAKE_POSITION_INDEPENDENT_CODE=ON
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案,但遗憾的是许多项目无条件设置此变量,因此 YMMV 这样做 (3认同)