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

博客 分享
0 190
张三
张三 2022-05-24 21:59:38
悬赏:0 积分 收藏

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

先说结论:

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

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

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

④:动态库是强函数,静态库是若符号函数,那么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.c2 #include<stdio.h>3 #define STRONG_FUNC  314 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;}

编译运行结果:

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

 

posted @ 2022-05-24 20:55 怎因一双媚眼惹尘埃 阅读(5) 评论(0) 编辑 收藏 举报
回帖
    张三

    张三 (王者 段位)

    821 积分 (2)粉丝 (41)源码

     

    温馨提示

    亦奇源码

    最新会员