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