先說結論:
①:動態庫優先順序最差,如果同時有靜態庫和動態庫,那麼首先使用的是靜態庫函式。
②:如果只有兩個或多個動態庫,那麼首先使用的是最開始連結的動態庫函式;
③:弱符號函式在動態庫中是起任何作用的
④:動態庫是強函式,靜態庫是若符號函式,那麼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; }
編譯執行結果:
結論:儘量不要再大型專案使用弱符號函式;使用的話儘量避開在動態庫中定義強符號函式