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

怎因一雙媚眼惹塵埃發表於2022-05-24

先說結論:

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

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

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

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

編譯執行結果:

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

 

相關文章