GCC的符号可见性: 解决Linux多个库同名符号冲突问题以及引用不同版本库的问题

目录

1 -fvisibility=default|internal|hidden|protected 

1.1 __attribute__((visibility("default")))  与  CXX=g++ -fvisibility=hidden 的作用

1.2 __attribute__((visibility("hidden")))  与  CXX=g++ -fvisibility=default的作用

2 我的问题

2.1 解决措施1:静态编译opencv + 使用-fvisibility=hidden

2.2 解决措施2:-W1,--exclude-libs,ALL

2.3 疑问:可见性设置的覆盖问题


某项目中因为使用到了不同版本库的问题,因此整理下GCC的符号可见性问题,方便自己以后再次使用。

1 -fvisibility=default|internal|hidden|protected 

GCC的visibility属性用来控制符号表的可见属性,举例子说明一下

1.1 __attribute__((visibility("default")))  与  CXX=g++ -fvisibility=hidden 的作用

如果我在编译库的makefile中增加了CXX=g++ -fvisibility=hidden,那么意思就是这个库中的这些函数对外都是隐藏的,除非我再某个函数声明前面增加了__attribute__((visibility("default")))用来说明这个函数的可见性保持默认。

这样写的作用是什么,就是我可以隐藏库里面的绝大多数接口,只开放某几个特定的接口,这样避免应用程序引用多个库时导致冲突。

1.2 __attribute__((visibility("hidden")))  与  CXX=g++ -fvisibility=default的作用

有了前面的分析,这个的作用也很明显,就是我隐藏库中的某几个特定的函数,开放绝大多数接口。

2 我的问题

我的问题现在有一个程序,然后它需要用到两个算法库1.so  2.so,但是由于某些原因1.so和2.so使用了不同的opencv库版本。那么这时候主程序就会包含两个不同版本的opencv库就会产生一些错误。

2.1 解决措施1:静态编译opencv + 使用-fvisibility=hidden

现在的解决措施是,我不动态编译opencv,而是将opencv静态编译成.a库,并且在编译opencv库的时候里面增加-fvisibility=hidden,由于算法库是静态链接opencv库的,所以即便opencv里面它使用了-fvisibility=hidden隐藏了接口也没事他还是能找到opencv库里面的接口的(如果动态编译opencv库并且使用了-fvisibility=hidden,那么算法库就找不到opencv库里面的接口了)。

2.2 解决措施2:-W1,--exclude-libs,ALL

-W1,--exclude-libs,ALL:这些都是链接器的选项,用于控制链接过程。看一下他们的作用:

  • -Wl:这个选项告诉编译器将后面的参数传递给链接器。在你的例子中,-Wl后面跟着的是,--exclude-libs,ALL,这个参数会被传递给链接器。

  • --exclude-libs:这是一个链接器选项,用于指定在链接过程中排除某些库。在你的例子中,--exclude-libs后面跟着的是ALL,这意味着链接器会排除所有的库。

  • ALL:这是--exclude-libs选项的参数,表示排除所有的库。当链接器看到这个参数时,它会把所有的库都标记为隐藏,这样在链接生成的.so文件时,这些库中的符号就不会被导出。

总的来说,-Wl,--exclude-libs,ALL这个选项的作用是在链接过程中隐藏所有库中的符号。这可以防止库中的符号被导出,从而避免符号冲突。这对于创建动态库(如.so文件)非常有用,因为它可以帮助你控制哪些符号应该被公开,哪些符号应该被隐藏。

2.3 疑问:可见性设置的覆盖问题

参考文献:

https://cumtchw.blog.csdn.net/article/details/125676653

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

雾锁王国服务器怎么建?雾锁王国服务器搭建方法

雾锁王国Enshrouded服务器搭建怎么搭建?非常简单,阿里云计算巢雾锁王国程序,可以一键搭建雾锁王国多人联机服务器,腾讯云是基于雾锁王国镜像系统,阿里云服务网aliyunfuwuqi.com汇总雾锁王国服务器搭建,超简…

kafka三节点集群平滑升级过程指导

一、前言 Apache Kafka作为常用的开源分布式流媒体平台,可以实时发布、订阅、存储和处理数据流,多用于作为消息队列获取实时数据,构建对数据流的变化进行实时反应的应用程序,已被数千家公司用于高性能数据管道、流分析、数据集成和任务关键型…

DolphinScheduler——工作流实例的生命周期

目录 一、DolphinScheduler架构原理 1.1 系统架构图 1.2 DolphinScheduler核心概念 1.2 创建工作流 1.2.1 如何触发一个工作流实例 1.2.2 任务调度链路监控 1.2.3 Workflow-DAG解析 DAG解析 Dispatch分发流程 Master和Worker的交互过程 1.3 任务运行状态 该篇文章主…

就业班 2401--2.28 Linux Day7--存储管理1

一 .存储管理 主要知识点: 基本分区、逻辑卷LVM、EXT3/4/XFS文件系统、RAID 初识硬盘 机械 HDD 固态 SSD SSD的优势 SSD采用电子存储介质进行数据存储和读取的一种技术,拥有极高的存储性能,被认为是存储技术发展的未来新星。 与传统硬盘相比&#…

Codeforces Round 929 (Div. 3)(A,B,C,D,E,F,G)

这场没考什么算法,比较水,难度也不是很高。比赛链接 硬要说的话E有个 前缀和 加 二分,F是数学BFS,G是个构造 A. Turtle Puzzle: Rearrange and Negate 题意: 给你一个由 n n n 个整数组成的数组 a a a 。您必须对…

Rocky Linux 运维工具yum

一、yum的简介 ​​yum​是用于在基于RPM包管理系统的包管理工具。用户可以通过 ​yum​来搜索、安装、更新和删除软件包,自动处理依赖关系,方便快捷地管理系统上的软件。 二、yum的参数说明 1、install 用于在系统的上安装一个或多个软件包 2、seach 用…

golang使用gorm操作mysql1

1.mysql连接配置 package daoimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/logger" )var DB *gorm.DB// 连接数据库,启动服务的时候,init方法就会执行 func init() {username : "roo…

stm32学习笔记:ADC

1 ADC简介 ADC的作用ADC就是一个电压表,把引脚的电压值测出来,放在一个变量里 DAC的作用信号发生器、音频解码芯片 ADC的两个关键参数: 1、分辨率,一般用多少位来表示,12位AD值,它的表示范围就是0~2^12-1&…

Modern C++ std::any为何要求Tp可拷贝构造?

小问题也会影响设计的思路,某个问题或某种case的探讨有助于理解设计的初衷。 声明:以下_Tp/Tp都是指要放入std::any的对象的类型。 它要求_Tp is_copy_constructible, 仅仅是因为有很多函数的实现调用了Tp的拷贝构造函数吗?比如说上节提到的初…

pikachu之xss获取键盘记录

前备知识 跨域 跨域(Cross-Origin)是指在互联网中,浏览器为了保护用户信息安全而实施的一种安全策略——同源策略(Same-Origin Policy),即浏览器禁止一个域上的文档或者脚本(如通过JavaScript发…

Rocky Linux安装部署Elasticsearch(ELK日志服务器)

一、Elasticsearch的简介 Elasticsearch是一个强大的开源搜索和分析引擎,可用于实时处理和查询大量数据。它具有高性能、可扩展性和分布式特性,支持全文搜索、聚合分析、地理空间搜索等功能,是构建实时应用和大规模数据分析平台的首选工具。 …

(十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目

前言 本节内容是一套关于微服务项目在docker环境中使用jenkins流水线部署的完整方案,在开始本节内容之前,我们需要提前安装好docker环境,以及docker本地镜像仓库docker harbor,同时安装好SonarQube用于代码验证,具体的安装步骤可参考作者的往期博客内容。 正文 在源码仓…

【MySQL】学习和总结标量子查询

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-kLo6jykc7AcEVEQk {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

爱普生为姿态和振动控制开发理想的IMU

- M-G370PDS0改善了短期噪声,扩展了型号阵容,使产品选择范围更广- 精工爱普生公司(“爱普生”,TSE: 6724)已经开发出M-G370PDS0样品,这是一种配备高性能六轴传感器的新型惯性测量单元(IMU)1。新产品计划于2022年春季批量生产。 爱…

MarkDown实用技巧:MarkDown中如何实现换行?

MarkDown实用技巧:MarkDown中如何实现换行? 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 👈 希望…

虚拟机安装+固定ip地址

一、下载CentOS 二、安装CentOS 1、打开你的VMware Workstation Pro,并点击“创建新的虚拟机” 2、点选典型(推荐)(T),并点击“下一步” 3、点选稍后安装操作系统(S),并点击“下一步” 4、点选Linux,并点击“下一步” 6、点击“…

flutter 一键打出不同包名、应用名、版本名、签名、应用图标、版本号的安装包

1. build.gradle 文件中配置不同的应用信息 flavorDimensions "app"productFlavors {app1 {//配置包名manifestPlaceholders [str: "releaseStr", package_name: "com.example.demo1"]applicationId "com.example.demo1"versionCode …

【SpringCloudAlibaba系列--OpenFeign组件】OpenFeign的配置、使用与测试以及OpenFeign的负载均衡

步骤一 准备两个服务,provider和consumer 本文使用kotlin语言 provider是服务的提供者,由provider连接数据库 RestController RequiredArgsConstructor RequestMapping("/provider/depart") class DepartController(private val departServ…

【GameFramework框架内置模块】6、实体(Entity)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录: https://blog.csdn.net/q7…

备战蓝桥杯————k个一组反转单链表

k个反转单链表,顾名思义就是k个节点为一组进行反转,这是一道困难的题目,如何解答,可以在我们前面的反转链表中得到思路。 如何 K 个一组反转单链表 题目描述 给你链表的头节点 head ,每 k 个节点一组进行翻转&#xf…