Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMAKE中添加-fPIC编译器选项的惯用方法是什么?_C++_C_Cmake - Fatal编程技术网

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

C++ CMAKE中添加-fPIC编译器选项的惯用方法是什么?,c++,c,cmake,C++,C,Cmake,我至少遇到了3种方法,我想知道哪种是惯用的方法。几乎所有静态库都需要这样做。我很惊讶CMake中的Makefile生成器没有自动将其添加到静态库中。(除非我遗漏了什么?) 我相信可能还有其他的变化。(如果找到问题,请编辑我的问题) 如果您碰巧知道这个问题的答案,您是否也知道是否有一种方法可以使第三方CMake项目在不修改其CMakeLists.txt文件的情况下使用此标志进行编译?我遇到过缺少该标志的静态库。将静态库编译为动态库时会出现问题 你会得到: relocation R_X86_64_3

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

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

如果您碰巧知道这个问题的答案,您是否也知道是否有一种方法可以使第三方CMake项目在不修改其CMakeLists.txt文件的情况下使用此标志进行编译?我遇到过缺少该标志的静态库。将静态库编译为动态库时会出现问题

你会得到:

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

您可以在所有目标上设置位置独立代码属性:

set(CMAKE_POSITION_INDEPENDENT_CODE ON)
或在特定的库中:

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

参考:

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


第二种方法似乎也是将其添加到第三方库的正确方法。Perfect.Hrm--我想知道你如何将它添加到由ExternalProject\u add添加的项目中?@010110101我不知道它是否有效,但你可以尝试在ExternalProject\u add处指定选项
CMAKE\u CACHE\u ARGS“-DCMAKE\u POSITION\u INDEPENDENT\u code:BOOL=true”
CMAKE\u POSITION\u INDEPENDENT\u code属性默认为
SHARED
目标设置,无需显式设置。@如果使用
set
命令(上面的第一个版本),则为否。如果使用第二个版本,则为每个库,而不是每个目录。此
set(CMAKE\u CXX\u标志)${CMAKE_CXX_FLAGS}-fpic”)
对我有效。^不要这样做。按照顶部答案中的建议,使用
POSITION\u INDEPENDENT\u code
属性。这是一个很好的答案,但遗憾的是,许多项目无条件地设置了此变量,以便YMMV这样做
add_library(lib1 lib1.cpp)
set_property(TARGET lib1 PROPERTY POSITION_INDEPENDENT_CODE ON)
-DCMAKE_POSITION_INDEPENDENT_CODE=ON