天天看點

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進來,即可。

繼續閱讀