【问题标题】:Invalid mex-file, libarmadillo, cannot open shared object file无效的 mex 文件,libarmadillo,无法打开共享对象文件
【发布时间】:2015-02-09 10:59:16
【问题描述】:

我知道有很多关于这个主题的帖子,这可能是重复的,但我不这么认为。我的配置是:Matlab R2014b,clang 3.4,Ubuntu 14.04,armadillo-4.600.4。

我有一个本地安装的犰狳(不是系统方面的,所以手动包括/链接),在 Matlab 之外可以正常工作。 我正在尝试使用 Matlab 中的 Armadillo 运行 Mex 文件。使用命令(简称截断)可以很好地编译:

mex -compatibleArrayDims -outdir +mx -L/home/john/.local/arma/lib -larmadillo -I/home/john/.local/arma/include test_arma.cpp

问题是当我尝试运行它时出现此错误:

Error using mx.test_arma
Invalid MEX-file '/path/to/+mx/test_arma.mexa64': libarmadillo.so.4: cannot open shared object file: No such file or directory

从启动 Matlab 的 shell 中回显的环境变量 LD_LIBRARY_PATH 包含 /home/john/.local/arma/lib(其中 libarmadillo.so 是),我还使用 setenv('LD_LIBRARY_PATH',...) 在 Matlab 中手动添加了此路径。我有什么遗漏吗?

【问题讨论】:

  • 我现在没有链接,但 MATLAB 对LD_LIBRARY_PATH 很感兴趣。也许先尝试一个符号链接。另外,您确定添加到路径的依赖项是 64 位的。我不知道 Ubuntu 的文件夹结构。
  • @chappjc 您对 64 位的评论很有趣,我将仔细检查所有内容,并从头开始重新编译我的共享库以确保没有不匹配,因为正如我所说的那样现在得到段错误,我相当有信心它不是来自代码本身。

标签: matlab shared-libraries mex armadillo


【解决方案1】:

所以我发现了如何运行它。现在是段错误:/ 而且我相当有信心这不是代码本身,因为我可以在 Matlab 之外编译和运行完全相同的代码。我会尝试找出问题所在,如果相关,我稍后会在这里发布我的冒险经历。

对于running问题;似乎 Matlab 使用变量 LD_RUN_PATH 在运行时加载共享库。在我的情况下,使用setenv 将我的路径... /.local/arma/lib 附加到LD_RUN_PATH 就可以了。为您的 cmets/答案干杯!

更新:我终于解决了这个问题,问题是由于 Matlab 的 BLAS/LAPACK 库之间的预期字长不匹配(32/64 位,即int32_t 与int64_t)和犰狳的叫声。我发布了两个解决方案here。

【讨论】:

  • 啊!我必须最终记住LD_RUN_PATH 变量。我知道 MATLAB 环境有些不同,但我很少使用 Linux...+1 BTW,为什么-compatibleArrayDims?
  • @chappjc Matlab 的新版本默认为 mex 启用 -largeArrayDims(或类似的东西),它本质上将 mwSize 定义为 uint64_t。我正在使用我自己的库,它本身使用 Armadillo,我现在一直在使用uint32_t。 compatibleArrayDims 只是一种恢复“旧方式”的方法,并使 Matlab 使用 32 位而不是 64 位进行索引:) (请注意:这可能是我的段错误的原因,如果由于某种原因这也会导致墨西哥期待 32 位库..)
  • 所以你使用无符号的 32 位索引,明白了。但我认为你的意思是 unsigned long long 是 64 位。 ;)
  • 啊,你太快了 :) 是的,我刚刚更正了,非常感谢!
猜你喜欢
  • 2011-12-23
  • 2013-04-21
  • 2013-05-05
  • 1970-01-01
  • 2017-05-21
  • 2012-05-24
  • 2014-02-10
  • 2021-01-06
  • 2018-07-03
相关资源
最近更新 更多