【问题标题】:What is the idiomatic way in CMAKE to add the -fPIC compiler option?CMAKE 中添加 -fPIC 编译器选项的惯用方式是什么?
【发布时间】:2016-11-12 19:11:03
【问题描述】:

我遇到了至少 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属性,如最佳答案中所建议的那样。

标签: c++ c cmake


【解决方案1】:

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

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

或在特定库中:

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

参考:CMAKE_POSITION_INDEPENDENT_CODEcmake build system

【讨论】:

  • 第二种方法似乎也是将其添加到 3rd 方库的正确方法。完美。
  • Hrm -- 我想知道你如何将它添加到 ExternalProject_Add 添加的项目中?
  • @010110110101 我不知道它是否有效,但您可以尝试在 ExternalProject_Add 中指定选项CMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
  • CMAKE_POSITION_INDEPENDENT_CODE 属性默认为SHARED 目标设置,无需显式设置。
  • @Carbon 如果您使用的是set 命令(上面的第一个版本),那么没有。如果您使用的是第二个版本,它是每个库,而不是每个目录。
【解决方案2】:

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

-DCMAKE_POSITION_INDEPENDENT_CODE=ON

【讨论】:

  • 这是一个很好的答案,但遗憾的是许多项目无条件设置了这个变量,所以 YMMV 这样做
猜你喜欢
  • 1970-01-01
  • 2013-12-26
  • 2018-06-19
  • 1970-01-01
  • 2014-06-07
  • 2021-10-07
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多