2014-06-05 14 views
3

我用下面的代碼片斷加載Linux上的so庫:dlopen的作品,但對dlsym不

handle = dlopen("myLib.so", RTLD_LAZY); 
if(handle == NULL) { 
    throw std::runtime_error("unable to load myLib.so"); 
} 

再往下我然後嘗試訪問在so的方法:

getter = dlsym(handle, "getMethod"); 
if(getter == 0) { 
    std::ostringstream msg; 
    msg << "missing entry point " << dlerror(); 
    throw std::runtime_error(msg.str().c_str()); 
} 

運行時,dlopen階段沒有出現異常,但我不斷收到錯誤:

missing entry point undefined symbol: getMethod

運行在myLib.sonm顯示getMethod

> nm myLib.so | grep get 

0000000000024220 T getMethod 

我想,我也該方法使用extern "C"爲好。

UPDATE

我現在懷疑的是,雖然手柄的NULL檢查不會導致異常,則可能是手柄本身的問題。

是否有無論如何我可以執行任何進一步的檢查,而不僅僅是== NULL,以確認電話的dlopen成功?

+2

是否在nm中顯示'T'或't'?如果顯示「t」,表示該功能未被導出。方法名稱中是否有前導下劃線?你也應該在你的問題中顯示'nm'輸出。 – Petesh

+0

添加到原文(顯示'T') – imrichardcole

+0

能否提供一些關於如何創建.so文件的信息? – brm

回答

0

一種可能性是存在一些失敗的依賴關係,RTLD_LAZY掩蓋了這一點。請嘗試使用RTLD_NOW來代替共享對象,看看您是否還可以使用dlopen()

+0

你會想象如果情況如此,'ldd'也會顯示依賴性問題嗎? – imrichardcole

+0

@imrichardcole:我應該這樣想。 – NPE

相關問題