linux 動態庫編譯:.so: undefined symbol

這幾天學習了下共享庫相關知識,今天編碼發現一點小問題(雖然是小問題,也花了幾個小時查找),這裏記錄下,給大家作個參考。

1、問題描述
g++編譯庫文件,編譯的時候不報錯,但是運行主程序的時候會出現以下錯誤:

/opt/code/c++/sharelib/libshare.so: undefined symbol: my_print
1
2、解決方案
編譯共享庫的時候,一定要以C的方式進行編譯。
純C代碼,可直接用gcc編譯;
C++代碼,需將對外暴露的接口(即外部可以直接調用的接口)以C方式編譯,即使用extern "C" { 代碼 }。

3、代碼實例
共享庫 sharelib.cpp:
編譯:g++ -o libshare.so -fPIC -Wall -shared sharelib.cpp

include <stdio.h>
#include <iostream>

extern "C" //“my_print”是該共享庫提供的對外接口,所以需要以C方式編譯
{
int my_print()
{
std::cout << "hello world" << std::endl;
return 0;
}
}
1
2
3
4
5
6
7
8
9
10
11
主程序 test_sharelib.cpp:
編譯:g++ -o test_sharelib -Wl,–rpath,/opt/code/c++/sharelib test_sharelib.cpp -ldl
“/opt/code/c++/sharelib” 是共享庫所在目錄

#include <stdio.h>
#include <iostream>
#include <dlfcn.h>

int main()
{
void* handle = NULL;
char* error;
int (*p)();

handle = dlopen("libshare.so", RTLD_LAZY);
if (NULL == handle)
{
if ((error = dlerror()) != NULL)
{
std::cout << error << std::endl;
return -1;
}
}

p = (int(*)())dlsym(handle, "my_print"); //這裏查找“my_print”,所以上麵的my_print函數需要以C方式編譯
if ((error = dlerror()) != NULL)
{
std::cout << error << std::endl;
return -1;
}

p();

dlclose(handle);

return 0;
}

相關說明:

1、VIP會員無限製任意下載,免積分。立即前往開通>>

2、下載積分可通過日常 簽到綁定郵箱 以及 積分兌換 等途徑獲得!

3、本站資源大多存儲在雲盤,如出現鏈接失效請評論反饋,如有密碼,均為:www.ipipn.com。

4、所有站內資源僅供學習交流使用。未經原版權作者許可,禁止用於任何商業環境,否則後果自負。為尊重作者版權,請購買正版作品。

5、站內資源來源於網絡公開發表文件或網友分享,如侵犯您的權益,請聯係管理員處理。

6、本站提供的源碼、模板、軟件工具等其他資源,都不包含技術服務,請大家諒解!

7、源碼、模板等資源會隨著技術、壞境的升級而存在部分問題,還請慎重選擇。

PS.源碼均收集自網絡,如有侵犯閣下權益,請發信件至: admin@ipipn.com .


源站網 » linux 動態庫編譯:.so: undefined symbol

發表評論

讚助本站發展 維持服務器消耗

全站源碼免費下載 立刻讚助