我至少遇到过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")

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

如果您碰巧知道这个问题的答案,您是否也知道是否有一种方法可以使第三方CMake项目在不修改其CmakeList的情况下使用此标志进行编译.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_POSITION_INDEPENDENT_CODEcmake build system

C++相关问答推荐

gcc已编译的可执行文件TSB是否同时暗示最低有效字节和最低有效位?

了解一些CLIPS原语数据类型

Tiva TM4C123GXL的I2C通信

为什么复合文字(C99)的返回会生成更多的汇编代码?

无法用C++编译我的单元测试

ESP32在vTaskDelay上崩溃

我的程序在收到SIGUSR1信号以从PAUSE()继续程序时总是崩溃()

插座打开MacOS组件

如何使用C++在控制台中以彩色打印被阻止的客户端

C代码在字符串中删除不区分大小写的子字符串的问题

获取前2个连续1比特的索引的有效方法

-Wnonnull-Compare警告不是具有误导性吗?

这段代码用于在C中以相反的顺序打印数组,但它不起作用

从不兼容的指针类型返回&&警告,但我看不出原因

Valgrind用net_pton()抱怨

从另一个宏函数调用C宏

&stdbool.h&q;在嵌入式系统中的使用

可以';t从A9G模块拨打电话

RISC-V GCC编译器错误编译ASM代码

使用 GCC 将一个函数中初始化的 struct 体实例通过指针传递到 C 中的另一个函数会产生不同的结果