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