cmake:target属性POSITION_INDEPENDENT_CODE和INTERFACE_POSITION_INDEPENDENT_CODE的区别

cmake定义的target有两个名字类似的属性:POSITION_INDEPENDENT_CODEINTERFACE_POSITION_INDEPENDENT_CODE,本文说明它们的含义和区别

-fPIC

介绍POSITION_INDEPENDENT_CODEINTERFACE_POSITION_INDEPENDENT_CODE属性前先介绍一下-fPIC编译选项。
-fPIC是gcc编译器的编译参数,以下是机器人告诉我的关于-fPIC参数的作用

在GCC编译器中, -fPIC 参数是指生成位置无关代码(Position Independent Code,PIC)。位置无关代码是一种可在内存中的任何位置加载和执行的代码。它通常用于动态链接库(shared library)的编译。

使用 -fPIC 参数编译代码时,生成的目标文件中的代码和数据引用都使用相对地址,而不是绝对地址。这样,当目标文件被加载到内存中时,它可以被放置在任何可用的内存地址上,而不会发生地址冲突。

通过使用位置无关代码,可以使得动态链接库在不同的内存地址空间中被加载和共享,提供更高的灵活性和可移植性。这对于操作系统和应用程序来说是非常重要的,因为它们可以在不同的环境中加载和使用这些动态链接库,而无需担心地址冲突和重新编译的问题。

总结来说, -fPIC 参数的作用是生成位置无关代码,用于编译动态链接库,以提供更高的灵活性和可移植性。

可以看出-fPIC参数是用于动态库的编译参数。

POSITION_INDEPENDENT_CODE

定义 -fPIC 参数最直接的方式是通过CMAKE_CXX_FLAGSCMAKE_C_FLAGS参数定义,
示例如下,因为它只是clang和gcc才有的参数所以在设置-fPIC参数的时候需要判断编译器

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
endif()

但这样在跨平台项目编译时需要更多的维护工作量,为了让CMakeLists.txt脚本更简洁,减少编译器无关性,通过POSITION_INDEPENDENT_CODE属性来定义-fPIC参数是推荐的方式:
POSITION_INDEPENDENT_CODE是cmake为target定义的属性
可以通过set_property,set_target_properties函数来定义POSITION_INDEPENDENT_CODE属性

## set_property示例
set_property(TARGET my_target PROPERTY POSITION_INDEPENDENT_CODE ON)
## set_target_properties 示例
set_target_properties (my_target PROPERTIES POSITION_INDEPENDENT_CODE ON)

根据cmake官方文档说明,当target为动态库时POSITION_INDEPENDENT_CODE 默认值为True,否则为静态库时默认为False;
参见 POSITION_INDEPENDENT_CODE

CMAKE_POSITION_INDEPENDENT_CODE

注意POSITION_INDEPENDENT_CODE是target的属性,所以set_property,set_target_properties 调用只对target有效,而通过CMAKE_CXX_FLAGSCMAKE_C_FLAGS参数定义定义 -fPIC 参数对所有target有效。如果也希望一次定义所有target的POSITION_INDEPENDENT_CODE属性,则可以通过设置CMAKE_POSITION_INDEPENDENT_CODE变量来实现,用于定义所有target的POSITION_INDEPENDENT_CODE属性的默认值

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

INTERFACE_POSITION_INDEPENDENT_CODE

INTERFACE_POSITION_INDEPENDENT_CODE也是target的属性,但它的作用与POSITION_INDEPENDENT_CODE不同
INTERFACE_POSITION_INDEPENDENT_CODE 属性通知消费者(即依赖于当前target的target)是否需要将他们的 POSITION_INDEPENDENT_CODE 属性设置为ON。如果该属性被设置为ON,那么所有消费者的 POSITION_INDEPENDENT_CODE 属性也将被设置为ON。同样地,如果该属性被设置为OFF,那么所有消费者的 POSITION_INDEPENDENT_CODE 属性也将被设置为OFF。如果该属性未定义,那么消费者将通过其他方式确定他们的 POSITION_INDEPENDENT_CODE 属性。
总结就是INTERFACE_POSITION_INDEPENDENT_CODE 用于确保消费者与链接的目标的POSITION_INDEPENDENT_CODE 属性保持一致性。

简单来说就是
如果一个target定义了INTERFACE_POSITION_INDEPENDENT_CODE属性并不会影响自己的POSITION_INDEPENDENT_CODE属性,而是会影响依赖它的Target的POSITION_INDEPENDENT_CODE属性

add_library(a STATIC a.cpp)
set_target_properties (a PROPERTIES POSITION_INDEPENDENT_CODE ON INTERFACE_POSITION_INDEPENDENT_CODE ON)
add_library(b SHARED b.cpp)

如上示例中,静态库a设置了POSITION_INDEPENDENT_CODEONINTERFACE_POSITION_INDEPENDENT_CODEON,因为INTERFACE_POSITION_INDEPENDENT_CODE 的传递作用,
动态库b的POSITION_INDEPENDENT_CODE属性自动为ON

INTERFACE_POSITION_INDEPENDENT_CODE 属性实际只有静态库需要设置,对于动态库不需要设置该属性,因为动态库不需要依赖库保存位置无关代码(PIC)一致性

位置无关代码一致性要求

前面说了-fPIC参数是用于动态库的编译参数。但对于静态库有时也需要指定-fPIC编译出位置无关代码,因为一个动态库连接静态库时,如果其连接的静态库都不是编译为位置无关代码代码(-fPIC),则在连接阶段可能会报错:

/usr/bin/ld: …/…/static.a(file.cpp.o): relocation R_X86_64_TPOFF32 against symbol `_ZGVZN6spdlog7details2os9thread_idEvE3tid’ can not be used when making a shared object; recompile with -fPIC

参考资料

https://cmake.org/cmake/help/latest/prop_tgt/POSITION_INDEPENDENT_CODE.html
https://cmake.org/cmake/help/latest/prop_tgt/INTERFACE_POSITION_INDEPENDENT_CODE.html
https://cmake.org/cmake/help/latest/variable/CMAKE_POSITION_INDEPENDENT_CODE.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CloudCompare 二次开发(14)——高斯滤波

目录 一、概述二、代码集成三、结果展示一、概述 使用CloudCompare与PCL的混合编程实现点云高斯滤波。高斯滤波的算法原理见:PCL 高斯滤波。 二、代码集成 1、mainwindow.h文件public中添加: void doActionPCLGassFilter(); // 高斯滤波2、mainwindow.cpp文件中添加头文…

视频文本检索(ICCV 23):Unified Coarse-to-Fine Alignment for Video-Text Retrieval

论文作者:Ziyang Wang,Yi-Lin Sung,Feng Cheng,Gedas Bertasius,Mohit Bansal 作者单位:UNC Chapel Hill 论文链接:http://arxiv.org/abs/2309.10091v1 项目链接:https://github.com/Ziyang412/UCoFiA 内容简介: …

音视频 SDL简介

一、SDL简介 SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Win…

Win10专业版开启远程桌面

Win10专业版开启远程桌面 方法一: 一、按“Win R”键,然后输入“sysdm.cpl”并按下回车键打开系统属性。 二、选择“远程”选项卡,在远程桌面中勾选“允许远程连接到此计算机”就可以开启远程桌面; 方法二: 一、打…

Rxjs操作符理解篇

创建运算符 ajax bindCallback: 把回调 API 转化为返回 Observable 的函数 bindNodeCallback: 把 Node.js 式回调 API 转换为返回 Observable 的函数。 defer empty from fromEvent fromEventPattern generate interval of range throwError timer iif 调度器 queue: 接受三…

【Python深度学习】深度学习框架Tensorflow、Pytorch介绍

深度学习已经成为了人工智能领域的一股重要力量,而深度学习框架则是在这个领域中进行研究和应用的必备工具。常见的深度学习框架包括TensorFlow、PyTorch、Keras、Theano和Caffe等,其中TensorFlow和PyTorch是最受欢迎的两个框架。本文将着重介绍这两个框…

IP代理与加速器:理解它们的区别与共同点

在网络使用过程中,我们经常会遇到需要提高访问速度或保护隐私的需求。IP代理和加速器都是常见的应对方案,但它们在工作原理和应用场景上存在一些区别。本文将为您深入探讨IP代理和加速器的异同,帮助您更好地理解它们的作用和适用情况&#xf…

评价指标分类

声明 本文是学习GB-T 42874-2023 城市公共设施服务 城市家具 系统建设实施评价规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件确立了城市家具系统建设实施的评价原则、评价流程,给出了评价指标,描述了 方…

visual studio 安装包丢失或损坏

visual studio 安装包丢失或损坏 如下图所示为vs2015报错信息。 解决方案: 找到镜像文件或者压缩包的解压位置; 路径:C:\Users\Administrator\Desktop\packages 复制该路径至上图的请提供搜索包的位置。

如何自动获取短信验证码?

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~ 这篇文章通过解决实际项目开发中遇到的如何自动获取短信验证码的问题,进一步讲述在Java中如何使用正则。 Java中如何使用正则 Java中正则相关类位于java.util.r…

【Vue】Vue中lauch.js的详细介绍,各个参数的内涵

"lauch.js" 在 Vue 中是一个启动文件,通常用来创建 Vue 实例并配置一些默认设置。 下面是常见的 "lauch.js" 参数及其意义: el:表示要挂载的元素,通常是一个字符串或者一个 DOM 对象。 router:表…

新款 锐科达 SV-2102VP SIP广播音频模块 RTP流音频广播

新款 锐科达 SV-2102VP SIP广播音频模块 RTP流音频广播 SV-2102VP和 SV-2103VP网络音频模块是一款通用的独立SIP音频功能模块,可以轻松地嵌入到OEM产品中。该模块对来自网络的SIP协议及RTP音频流进行编解码。 本系列模块可以应用于以下领域: • 各种商…

1.6python基础语法——输出

作用:程序输出内容给用户 1)格式化符号 格式符号转换%s字符串%d有符号的十进制整数%f浮点数%c字符%u无符号十进制整数%o八进制整数%x十六进制整数(小写ox)%X十六进制整数(大写OX)%e科学计数法&#xff08…

selenium自动化测试-登录网站用户

昨天学习了selenium自动化测试工具的入门,知道了Selenium是用于自动化控制浏览器做各种操作,打开网页,点击按钮,输入表单等等。 今天学习通过selenium自动化测试工具自动登录某网站用户操作。 第一步:确定目标网址 …

【C++进阶】:哈希

哈希 一.unordered_map二.底层结构1.哈希概念2.解决哈希冲突1.闭散列2.开散列 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 l o g 2 N log_2N log2​N,即最差情况下需要比较红黑树的高度次,当树中的…

【C++面向对象侯捷】4.参数传递与返回值

文章目录 构造函数放在 private?>单例模式 const member functions(常量成员函数) > 不会改变数据内容的,加上const参数传递:pass by value vs. pass by reference(to const)【最好传引用,占用空间小】返回值传递&#xff1…

Spire.OCR for .NET 1.9.0 Crack

Spire.OCR for .NET 是一个专业的 OCR 库,用于从 JPG、PNG、GIF、BMP 和 TIFF 格式的图像中读取文本。开发人员可以轻松地在 C# 和 VB.NET 的 .NET 应用程序中添加 OCR 功能。它支持常用的图像格式,并提供从图像中​​读取多个字符和字体、粗体和斜体样式…

vue3 知识点(二)

1: 隐藏dom节点 ​ v-if 是注释掉dom节点 ​ v-show 只是改变css样式&#xff1a;display:none&#xff0c;如果对性能有高要求的话&#xff0c;可以使用v-show 2: 点击事件 click 可以把click 改成动态的 [event] <a-button type"primary" [event]"hand…

CDN内容分发系统

CDN 分发系统的架构。CDN 系统的缓存&#xff0c;也是一层一层的&#xff0c;能不访问后端真正的源&#xff0c;就不打扰它。 在没有 CDN 的情况下&#xff0c;用户向浏览器输入 www.web.com 这个域名&#xff0c;客户端访问本地 DNS 服务器的时候&#xff0c;如果本地 DNS 服务…

VSCode 安装使用教程 环境安装配置 保姆级教程

一个好用的 IDE 不仅能提升我们的开发效率&#xff0c;还能让我们保持愉悦的心情&#xff0c;这样才是非常 Nice 的状态 ^_^ 那么&#xff0c;什么是 IDE 呢 &#xff1f; what IDE&#xff08;Integrated Development Environment&#xff0c;集成开发环境&#xff09;是含代码…