2016-03-06 35 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链接器标记,其中链接器将绕过该组文件,直到找到所有未解析的符号。