• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

值得注意的:c++动态库、静态库、弱符号__attribute__((weak))以及extern之间的关系 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

先说结论:

①:动态库优先级最差,如果同时有静态库和动态库,那么首先使用的是静态库函数。

②:如果只有两个或多个动态库,那么首先使用的是最开始链接的动态库函数;

③:弱符号函数在动态库中是起任何作用的

④:动态库是强函数,静态库是若符号函数,那么extern使用的就是若符号函数

下面举例说明:

Ⅰ:首先是本源文件中包含若函数,然后链接动态库的强符号函数。如下分别是源码和结论

//main.cpp
#include<stdio.h>
#define _weak __attribute__((weak))

extern "C" {
    extern int  test_strong(void);
     _weak int test_strong(void)
    {
                return 1;
    }
}

int  main()
{
        int  ret = test_strong();
        printf("ret = %d\n",ret);
        return 0;
}
1 //strong_dyn.c
2 #include<stdio.h>
3 #define STRONG_FUNC  31
4 int  test_strong(void)
5 {
6        return STRONG_FUNC  ;
7 }

编译运行结果:

注释:

  ①:动态库编译方法(不懂得可以参照这里):

    gcc -fPIC strong_dyn.c -c

    gcc -shared -o libStrong_dyn.so strong_dyn.o

  ②:动态库使用方法(不懂得可以参照这里):

    gcc main.cpp libStrong_dyn.so -o app

Ⅱ:如果静态使用弱符号函数,并且外部引用那么,使用的就是强符号函数;下面是代码和结论:

//mian.cpp
#include<stdio.h>
#define _weak __attribute__((weak))

extern "C" {
    extern int  test_strong_static(void);
     _weak int test_strong_static(void)
    {
                return 1;
    }
}

int  main()
{
        int  ret = test_strong_static();
        printf("ret = %d\n",ret);
        return 0;
}
//weak_static.c
#include<stdio.h>

int test_strong_static(void)
{
     return 22;
}

编译运行结果:

 结论:尽量不要再大型项目使用弱符号函数;使用的话尽量避开在动态库中定义强符号函数

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#人脸识别C#百度人脸识别发布时间:2022-07-18
下一篇:
c#winform关闭窗体时,同时结束线程(转)发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap