2012-04-27 50 views
0

我正在構建/使用LAMMPS的python模塊,它是開源的分子動力學模擬器(project home,source)。流氓缺少C++符號 - 調試策略?

python模塊通過將C++應用程序編譯爲庫並使用CDLL/ctypes調用C函數接口來工作。當您在python中調用CDLL()函數時,如果有任何操作系統在庫本身中找不到的符號,並且無法從其他可用庫中加載,則加載會失敗。

我得到的特定符號是一個C++錯位的名稱__ZN3MPI3Win14Set_errhandlerERKNS_10ErrhandlerE,它可能是MPI_Win_set_errhandler(或某些名稱空間/面向對象,具有類似名稱的equivilent)。在上下文中,我使用python/setup_serial.py文件編譯它,它應該使用虛擬MPI接口構建,並且不應該引用任何實際的MPI符號;所以這是一個流氓的參考,在某處。我也對源進行了一些修改,但是當我禁用所有更改時,出現同樣的錯誤。

我的問題是,什麼是最好的調試策略,找出一個符號在動態庫中引用這種錯誤的地方?到目前爲止,我已經嘗試搜索引用這個符號(或部分名稱)的源代碼,但我沒有找到任何實例(實際上,唯一的結果是來自python構建過程的二進制文件,我無法導入庫。)

我的下一步是以某種方式在內部搜索二進制文件,我想,但我不知道從哪裏開始(或其他策略)。

回答

2

C++ filt的是你的朋友

$ c++filt __ZN3MPI3Win14Set_errhandlerERKNS_10ErrhandlerE 
MPI::Win::Set_errhandler(MPI::Errhandler const&) 

現在做這個庫 http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=512616

貌似存在其中部分升級,但不會重新編譯的情況下的快速谷歌搜索。第二件事是查看編譯器的鏈接線並查看它包含的庫​​。

最後萬不得已做這樣的事情:

readelf -s /path/to/libfoo.so 

並開始grepping四周,看看它是否某處定義。

+0

鏈接線非常長,但我已經檢查過,它包含指向'src/STUBS /'(相對於項目根目錄)下的虛擬C MPI API的鏈接。我不確定我明白爲什麼在官方MPI發行版中取消內聯函數會破壞API的本地虛擬版本 - 除非我引用了現在已更改的官方MPI頭文件。 – tehwalrus 2012-04-27 22:13:27

+0

我檢查了我的系統文件夾,並且有一個mpi.h,但它的版本是1.2.8 - 在Debian線程開始出現問題之前,所以即使這覆蓋了本地頭文件也不應該中斷的東西。 – tehwalrus 2012-04-27 22:20:46

+0

唯一需要添加的是你需要在OS X上使用'gobjdump'(在macports的binutils包下),因爲readelf是linux-only [見這裏](http://stackoverflow.com/questions/3286675/) readelf-like-tool-for-mac-os-x),但除此之外,這是對所需工具的非常好的總結。謝謝! :) – tehwalrus 2012-04-27 22:54:12