两个Framework中如果定义了相同名字的C函数会发生什么?
一、两个Framework中如果定义了相同名字的C函数
后果
在使用多个动态库时,两个动态库之间有可能存在相同名称的函数,由于动态链接器在程序加载时会对外部引用进行重定位,这样会出现只有名列前茅个函数生效,即所有对该函数的调用都将指向名列前茅个加载的动态库的同名函数中。这样就会很混乱,而且在想改名称也不是很简单的情况下就会很麻烦(例如同名函数太多,甚至就是模板)等等。
处理方法
这里只找到一种处理方法,当然你直接把名字改成不一样或者统一添加前缀(例如C++ namespace)也不错。方法如下:
-fvisibility=hidden
将以上的写入gcc/g++中去,从.o的生成到.so的生成的命令行都要填上。这个有什么作用呢?GUN规定动态库中的所有函数的全局变量默认是对外可见的,如果编译动态库时不添加以上参数,默认是可见的,添加之后,如果调用动态库的函数,由于无法定义到引用的实际实现,会报错:
undefined symbol: XXX
所以还没有结束,接着就是要把动态库部分需要对外显示的函数接口显示出来:例如模块的入口函数:
__attribute__((visibility(“default”))) int app_main(void)
注
__attribute__作用:
__attribute__ 可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)
格式:__attribute__(((visibility(“default”),,,,,))
当然大家可以看明白,同名的不是可执行文件要调用的函数,而是动态库中其他函数要使用的。
延伸阅读:
二、容易产生C语言命名冲突的情况
1、当系统只有一个模块的时候,命名冲突的问题不太严重。当系统有N个模块之后,很难保证不发生命名冲突。如果代码是我们自己编写的,可以通过良好的编程习惯来避免这个问题。
2、但是如果你的系统中有多个开源库的话,就非常容易产生命名冲突的问题了。因为这些开源库是不同人编写的,他们可能遵循的不同的命名规则。
3、另外一种非常容易产生命名冲突的情况是:如果你的系统有一部分是C语言实现的闭源的静态库或者动态库(有可能是第三方提供的库,或者是合作伙伴提供的库),没有源码,你就很难避免命名冲突了。

猜你喜欢LIKE
相关推荐HOT
更多>>
分布式开源物联网MQTT消息服务器EMQ怎么做数据的存储?
一、分布式开源物联网MQTT消息服务器EMQ怎么做数据的存储(1)实现存储的最简单方法是添加一个订阅通配符主题的附加客户端(在MQTT中恰好是#)...详情>>
2023-10-14 22:44:14
数据库种类有哪些?
一、数据库的种类1、关系型数据库(RDBMS)关系型数据库使用表格(二维结构)来组织和存储数据。它们使用结构化查询语言(SQL)进行数据管理和...详情>>
2023-10-14 22:12:41
对数量庞大的照片进行分类管理,较好的方便检索的方法是什么?
一、对数量庞大的照片进行分类管理其实无论任何方法,其实本质都是一样的,就是给照片打上标签,然后按标签分类这些照片(人脸识别也好,地理标...详情>>
2023-10-14 17:18:27
在数据库中,schema、catalog分别指的是什么?
一、在数据库中,schema、catalog分别指的是什么这么说吧,在关系型数据库中,分三级:database.schema.table。即一个数据库下面可以包含多个sc...详情>>
2023-10-14 16:43:29热门推荐
Shell点文件可以为你做点什么?
沸什么是 DMAIC 方法,优点有哪些?
热分布式开源物联网MQTT消息服务器EMQ怎么做数据的存储?
热数据库种类有哪些?
新web前端和UI前端的区别?
Java并发中什么是可见性?
Java中private,默认,protected,public修饰符的区别?
InnoDB的next-key lock为什么是左开右闭的?
Chromium是什么?
为什么分布式数据库这么喜欢用kv store?
web测试流程的重点是什么?
Android开发中为什么很少使用JSON存储数据?
为什么要有U-Boot?
对数量庞大的照片进行分类管理,较好的方便检索的方法是什么?
技术干货






