由于未定义的符号而导致MEX文件无效' start_time'

时间:2016-03-06 23:11:16

标签: c++ matlab symbols static-linking automake

我正在尝试运行从此处下载的复杂冰盖建模软件:ISSM

使用automake进行配置并正确编译后,我收到以下错误。

  

无效的MEX文件' /home/cpmcgrat/Documents/Research/ISSM/issm/trunk/lib/TriMesh.mexa64':   /home/cpmcgrat/Documents/Research/ISSM/issm/trunk/lib/libISSMModules.so.0:未定义的符号:start_time

     

三角形出错(第40行)   [元素,X,Y,段,segmentmarkers] = TriMesh(域名,riftname,面积);

     

runme出错(第11行)       MD =三角形(模型,' ./ 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还是比较新的。

我尝试使用以下输出运行以下命令:

  

$ nm ./lib/libISSMModules.so.0 | grep' start_time'

     

U start_time

运行ldd命令会返回以下未定义的符号:

  

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

     

未定义的符号:_ZN14ToolkitOptions14toolkitoptionsE(/home/cpmcgrat/Documents/Research/ISSM/issm/trunk/lib/libISSMCore.so.0)   未定义的符号:_ZN8IssmComm4commE(/home/cpmcgrat/Documents/Research/ISSM/issm/trunk/lib/libISSMCore.so.0)   未定义的符号:_ZN8IssmComm8parallelE(/home/cpmcgrat/Documents/Research/ISSM/issm/trunk/lib/libISSMCore.so.0)   未定义的符号:_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)   undefined symbol:Using_Main(./lib/libISSMModules.so.0)   undefined symbol:interface(./lib/libISSMModules.so.0)   undefined symbol:read_params(./lib/libISSMModules.so.0)   undefined symbol:smalloc_stats(./lib/libISSMModules.so.0)

未定义的符号前缀为UB

据我了解,U表示该符号未定义,B表示该符号位于未初始化的部分。我不太清楚如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

我无法下载并尝试您的代码,但您所描述的症状(符号在库中定义,您链接到库,但仍未找到符号)看起来非常就像图书馆链接顺序的问题一样。

有好文章herehere解释链接顺序问题。简而言之,如果符号是在需要该符号(libB)的文件或库之前链接的库(libA)中定义的,则该符号将被报告为缺失。

因此,订单libA libB(其中libB取决于libA)会触发错误,但libB libA会正常。如果两个库都具有相互依赖关系,则使用libA libB libA或使用--start-group--end-group链接器标志,其中链接器将绕过文件组,直到找到所有未解析的符号