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

标签 c++ c cmake

我遇到了至少 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_POSITION_INDEPENDENT_CODE ON)

或在特定库中:

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

引用:

关于c++ - 在 CMAKE 中添加 -fPIC 编译器选项的惯用方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38296756/

相关文章:

c++ - 使用 malloc/new 时无法编译 stm32l4r5xx

c++ - OpenCv 未定义对 `cv::的引用

C++ 在两个 std::map 之间查找匹配项的有效方法

c - C 总是必须使用指针来处理地址吗?

c - 使用 llvm 提示编译器

c++ - 在配置脚本名称中使用指定版本的 find_package

c++ - 将数据从 HTML5 应用程序传输到在客户端上下文中运行的 native 应用程序

c - 当我们在c中使用fork时,进程之间是否共享数据?

c++ - CMake 将依赖项复制到可执行输出路径

在 Mac OSX 10.11.6 上找不到 clock_gettime