2016-03-06 69 views
2

我試圖運行從這裏下載一個複雜的冰蓋建模軟件:ISSM無效MEX文件,由於未定義的符號「START_TIME」

運行使用automake配置和編譯正確,我發現了以下錯誤後。

無效MEX文件 '/home/cpmcgrat/Documents/Research/ISSM/issm/trunk/lib/TriMesh.mexa64': /家庭/ cpmcgrat /文檔/科研/ ISSM/ISSM /主幹/ lib目錄/libISSMModules.so.0:undefined symbol:start_time

三角形錯誤(第40行) [elements,x,y,segments,segmentmarkers] = TriMesh(domainname,riftname,area);

runme錯誤(第11行) md = triangle(model,'。/ DomainOutline.exp',1000);

這是從下面的代碼片段在runme.m

disp(' Step 1: Mesh creation'); 

%Generate initial uniform mesh (resolution = 20000 m) 
md=triangle(model,'./DomainOutline.exp',1000); 

我在這裏的想法是,triangle.a庫,這是對鏈接是一個靜態文件,因此它應該需要一個共享對象。但是,即使更新三角形庫爲triangle.so後,我仍然收到相同的錯誤。在這一點上,我完全沒有想法。如果我缺乏任何相關信息,請告訴我,我對GNU autotools還比較陌生。

我試着用下面的輸出運行以下命令:

$納米./lib/libISSMModules.so.0 | grep '可以START_TIME'

ùSTART_TIME

ldd的命令的運行返回以下未定義的符號:

$ LDD -r ./lib/libISSMModules.so.0

undefined symbol:_ZN14ToolkitOptions14toolkitoptionsE(/home/cpmcgrat/Documents/Research/ISSM/issm/trunk/lib/libISSMCore.so.0) undefined symbol:_ZN8IssmComm4commE(/ home/cpmcgrat/Documents/Research/ISSM/issm /trunk/lib/libISSMCore.so.0) undefined symbol:_ZN8IssmComm8parallelE(/home/cpmcgrat/Documents/Research/ISSM/issm/trunk/lib/libISSMCore.so.0) undefined symbol:_Z9ApiPrintfPKc(/ home/cpmcgrat /Documents/Research/ISSM/issm/trunk/lib/libISSMCore.so.0) undefined symbol:start_time(./lib/libISSMModules.so.0) undefined symbol:input_time(./lib/libISSMModules.so.0 ) 未定義符號:Using_Main(./lib/libISSMModules.so.0) 未定義符號:接口(./lib/libISSMModules.so.0) 未定義符號:read_params(./lib/libISSMModules.so.0) undefined symbol:smalloc_stats(./lib/libISSMModules.so.0)

未定義符號的前綴爲UB

據我的理解,U表示符號未定義,B表示該符號位於未初始化的部分。但我很不確定如何解決這個問題。

+0

也許您的DYNAMIC_LIBRARY_PATH變量設置不正確。 – AnonSubmitter85

+0

@ AnonSubmitter85在哪裏進行修改?環境,配置或生成文件? – asdf

+0

如果使用BASH,環境通常類似'export DYNAMIC_LIBRARY_PATH =/path/to/shared/objects1:/ path/to/blahblah /'。不過,我認爲你需要在啓動matlab之前進行設置。另外,如果已經定義了,一定要執行'export DYNAMIC_LIBRARY_PATH =/path1:/ path2:$ DYNAMIC_LIBRARY_PATH'。 – AnonSubmitter85

回答

2

我無法下載並試用您的代碼,但您描述的症狀(符號在庫中定義,您鏈接到庫,但符號仍未找到)外觀非常類似於圖書館鏈接順序的問題。

有很好的文章herehere解釋鏈接順序的問題。簡而言之,如果符號是在需要符號(libB)的文件或庫之前鏈接的庫(libA)中定義的,那麼該符號將被報告爲缺失。

因此,訂單libA libB(其中libB取決於libA)將觸發該錯誤,但libB libA將會正常。如果兩個庫都有相互依賴關係,則可以使用libA libB libA或使用--start-group--end-group鏈接器標記,其中鏈接器將繞過該組文件,直到找到所有未解析的符號。