Armadillo + Matlab Mex段错误

时间:2015-02-10 00:14:49

标签: matlab segmentation-fault lapack blas armadillo

我整天都在弄乱这个,所以我想我可以让每个人都从我的经历中受益,请看下面的答案。

我首先遇到在Matlab中运行已编译的Mex文件的问题,因为Matlab抱怨它无法打开共享库libarmadillo。我solved this使用环境变量LD_LIBRARY_PATHLD_RUN_PATH(osx中的DYLD_LIBRARY_PATHLYLD_RUN_PATH)。

然而问题仍然是,一个简单的测试文件会在运行时发生段错误,即使完全相同的代码在Matlab外部编译并运行良好(不是Mex' d)。

2 个答案:

答案 0 :(得分:4)

段错误似乎是由于Matlab在其捆绑的LAPACK和BLAS库中使用64位整数(long longint64_t)这一事实。另一方面,Armadillo在64位平台上使用32位整数(常规int,或默认使用int32_t

有两种解决方案;第一个涉及强制Matlab链接到系统的库(使用int s),第二个涉及更改Armadillo的配置文件以使用BLAS启用long long。我倾向于认为第一个更可靠,因为没有黑盒效应,但它也更麻烦,因为你需要手动安装并记住你的BLAS和LAPACK库的路径。

两种解决方案都要求我停止使用Armadillo的共享库并手动链接/包含源。 要做到这一点,你必须简单地在你的系统上安装LAPACK和BLAS(如果它们不在那里,在Ubuntu中是libblas-devliblapack-dev),并将整个includes目录复制到一个合理的地方例如在$HOME/.local/arma中。


解决方案1:链接到系统的库

在matlab控制台中,将环境变量BLAS_VERSIONLAPACK_VERSION设置为指向系统的库。就我而言(Ubuntu 14.04,Matlab R2014b):

setenv('BLAS_VERSION','/usr/lib/libblas.so');
setenv('LAPACK_VERSION','/usr/lib/liblapack.so');

然后你可以正常编译:

mex -compatibleArrayDims -outdir +mx -L/home/john/.local/arma -llapack -lblas -I/home/john/.local/arma test_arma.cpp

或者如果您在ARMA_64BIT_WORD中定义了标记includes/armadillo_bits/config.hpp,则可以删除选项-compatibleArrayDims


解决方案2:更改Armadillo的配置

第二个解决方案涉及在Armadillo的配置文件ARMA_BLAS_LONG_LONG中取消注释标记includes/armadillo_bits/config.hpp。 Matlab将链接到其捆绑的LAPACK和BLAS库,但这次Armadillo不会因为使用正确的字大小而发生段错误。与以前相同,如果您要删除ARMA_64BIT_WORD,也可以取消注释-compatibleArrayDims

答案 1 :(得分:-1)

编译

Array(6).fill({key: true})

(在Matlab中)

mex -larmadillo -DARMA_BLAS_LONG_LONG armaMex_demo2.cpp

没有段错误。

但是,用

编译
armaMex_demo2(rand(1))

(在Matlab中)

mex -larmadillo  armaMex_demo2.cpp

导致段错误。

这里,armaMex_demo2.cpp是

armaMex_demo2(rand(1))