• 值得注意的: 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.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;
    }

    编译运行结果:

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

  • 相关阅读:
    力扣452题、435题、56题(用最少量的箭引爆气球,无重叠区间,合并区间)
    力扣860题(柠檬水找零)
    力扣135题、406题(分发糖果、根据身高重建队列)
    力扣134题(加油站)
    力扣1005题(K次取反后最大化的数组和)
    力扣122题、714题(买卖股票)
    力扣53题(最大子序和)
    力扣376题(摆动序列)
    力扣455题(分发饼干)
    力扣51题(n皇后)
  • 原文地址:https://www.cnblogs.com/Jlord/p/16307152.html
Copyright © 2020-2023  润新知