我遇到了至少 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")
我相信可能还有其他变化。 (如果你找到一个问题,请编辑我的问题)
如果您碰巧知道这个问题的答案,您是否还知道是否有一种方法可以在不修改其 CMakeLists.txt 文件的情况下使用此标志编译第 3 方 CMake 项目?我遇到了缺少该标志的静态库。将静态库编译为动态库时会出现问题。
你得到:
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")
对我有用。
POSITION_INDEPENDENT_CODE
属性,如最佳答案中所建议的那样。
您可以在所有目标上设置与位置无关的代码属性:
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 build system
您还可以将以下命令行选项传递给 cmake
(如果这不是您的 cmake 项目和/或您不能或不想修改项目文件):
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
CMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
CMAKE_POSITION_INDEPENDENT_CODE
属性默认为SHARED
目标设置,无需显式设置。set
命令(上面的第一个版本),那么不会。如果您使用的是第二个版本,它是每个库,而不是每个目录。CMAKE_POSITION_INDEPENDENT_CODE
存在相对未记录的行为。这可能会产生不良后果,尤其是对于需要fPIC
而不是fPIE
的 Qt 可执行文件。因此,在某些情况下,target_compile_options()
可能是最佳选择。