值得注意的: c++動態庫、靜態庫、弱符號__attribute__((weak))以及extern之間的關係

2022-05-25 06:01:57

先說結論:

①:動態庫優先順序最差,如果同時有靜態庫和動態庫,那麼首先使用的是靜態庫函數。

②:如果只有兩個或多個動態庫,那麼首先使用的是最開始連結的動態庫函數;

③:弱符號函數在動態庫中是起任何作用的

④:動態庫是強函數,靜態庫是若符號函數,那麼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;
}

編譯執行結果:

 結論:儘量不要再大型專案使用弱符號函數;使用的話儘量避開在動態庫中定義強符號函數