【问题标题】:Invalid MEX-file due to undefined symbol 'start_time'由于未定义符号“start_time”,MEX 文件无效
【发布时间】:2025-12-02 00:05:02
【问题描述】:

我正在尝试运行从这里下载的复杂冰盖建模软件: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,segments,segmentmarkers]=TriMesh(domainname,riftname,area);

runme 中的错误(第 11 行) md=triangle(model,'./DomainOutline.exp',1000);

这是来自runme.m中的以下代码sn-p:

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 '开始时间'

U 开始时间

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) 未定义符号:接口 (./lib/libISSMModules.so.0) 未定义符号:read_params (./lib/libISSMModules.so.0) 未定义符号:smalloc_stats (./lib/libISSMModules.so.0)

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

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

【问题讨论】:

  • 可能您的 DYNAMIC_LIBRARY_PATH 变量设置不正确。
  • @AnonSubmitter85 将在哪里进行修改?环境、配置还是makefile?
  • 环境,如果使用 BASH,通常类似于 export DYNAMIC_LIBRARY_PATH=/path/to/shared/objects1:/path/to/blahblah/。但是,我认为您需要在启动 matlab 之前进行设置。另外,如果已经定义,请务必使用export DYNAMIC_LIBRARY_PATH=/path1:/path2:$DYNAMIC_LIBRARY_PATH
  • @AnonSubmitter85 我将libISSMModules.so.0triangle.a 的路径添加到DYNAMIC_LIBRARY_PATH,但我仍然遇到同样的错误。设置此变量后是否需要重新配置/重新编译?
  • 无需重新编译;它在程序启动时加载库。 *.a 库是静态的,需要提供给链接器。确保在设置库路径后重新启动 matlab 并从同一终端执行此操作。

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


【解决方案1】:

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

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

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

【讨论】: