1. 程式人生 > >linux動態庫so呼叫外部so,執行時出現undefined symbol

linux動態庫so呼叫外部so,執行時出現undefined symbol

1、首先排查,C++呼叫了c的庫?是不是需要加上extern "c",尤其是類的動態庫,需要用到工廠模式,create一個物件出來,該工廠函式需要extern "c"宣告。

extern "C" CDbBase* create();
extern "C" void destroy(CDbBase* p);

--

CDbBase* create()
{
return new CDbDb2;
}


void destroy(CDbBase* p)
{
printf("destroy CDbDb2!\n");
   delete p;
}

2、使用ldd -r xxx.so或者 nm -A xxx.so等命令,檢視so有哪些符號未定義的。

3、在步驟2發現有很多未定義的符號,跟執行時undefined symbol符合,而且該符號是外部的系統的動態庫裡定義的,那目標就定位到自己寫的動態庫裡,連結的過程時,是否把這些動態庫給連結進來。

查詢發現makefile編譯動態庫時,找不到連結符號也是允許編譯通過的,那最好是加上限制條件,在makefile加上 -Xlinker --unresolved-symbols=ignore-in-shared-libs ,讓其報錯,把未定義的符號給報錯出來。

4、根據makefile的報錯,原來是忘了把外部動態庫給 -l進來,並把動態庫路徑-L進來,即可。