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