由于未定义的符号'start_time',MEX 文件无效

Invalid MEX-file due to undefined symbol 'start_time'

本文关键字:time MEX 文件 无效 start 符号 未定义      更新时间:2023-10-16

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

运行自动制作配置并正确编译后,出现以下错误。

无效的 MEX 文件 '/home/cpmcgrat/Documents/Research/ISSM/issm/trunk/lib/TriMesh.mexa64': /home/cpmcgrat/Documents/Research/ISSM/issm/trunk/lib/libISSMModules.so.0: undefined symbol: start_time

三角形中的错误(第 40 行) [elements,x,y,segments,segmentmarkers]=TriMesh(域名,裂缝名称,面积);

运行错误(第 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自动化工具还比较陌生。

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

$ 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) 未定义的符号:start_time (./lib/libISSMModules.so.0) 未定义的符号:input_time (./lib/libISSMModules.so.0) 未定义的符号:Using_Main (./lib/libISSMModules.so.0) undefined symbol: interface (./lib/libISSMModules.so.0) 未定义的符号:read_params (./lib/libISSMModules.so.0) 未定义的符号:smalloc_stats (./lib/libISSMModules.so.0)

未定义的符号以 UB 为前缀。

我的理解是,U意味着符号未定义,B表示符号位于未初始化的部分。但是,我不确定如何解决此问题。

我无法下载和尝试您的代码,但您描述的症状(符号是在库中定义的,您正在链接到库,但仍然找不到符号)看起来非常像库链接顺序的问题。

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

因此,顺序libA libB(其中libB取决于libA)将触发错误,但libB libA是可以的。 如果两个库都有相互依赖关系,则使用 libA libB libA 或使用 --start-group--end-group 链接器标志,其中链接器将遍历文件组,直到找到所有未解析的符号。