千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > 两个Framework中如果定义了相同名字的C函数会发生什么?

两个Framework中如果定义了相同名字的C函数会发生什么?

来源:千锋教育
发布人:xqq
时间: 2023-10-11 14:46:37 1697006797

一、两个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语言实现的闭源的静态库或者动态库(有可能是第三方提供的库,或者是合作伙伴提供的库),没有源码,你就很难避免命名冲突了。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT