我整天都在弄乱这个,所以我想我可以让每个人都从我的经历中受益,请看下面的答案。
我首先遇到在Matlab中运行已编译的Mex文件的问题,因为Matlab抱怨它无法打开共享库libarmadillo
。我solved this使用环境变量LD_LIBRARY_PATH
和LD_RUN_PATH
(osx中的DYLD_LIBRARY_PATH
和LYLD_RUN_PATH
)。
然而问题仍然是,一个简单的测试文件会在运行时发生段错误,即使完全相同的代码在Matlab外部编译并运行良好(不是Mex' d)。
答案 0 :(得分:4)
段错误似乎是由于Matlab在其捆绑的LAPACK和BLAS库中使用64位整数(long long
或int64_t
)这一事实。另一方面,Armadillo在64位平台上使用32位整数(常规int
,或默认使用int32_t
。
有两种解决方案;第一个涉及强制Matlab链接到系统的库(使用int
s),第二个涉及更改Armadillo的配置文件以使用BLAS启用long long
。我倾向于认为第一个更可靠,因为没有黑盒效应,但它也更麻烦,因为你需要手动安装并记住你的BLAS和LAPACK库的路径。
两种解决方案都要求我停止使用Armadillo的共享库并手动链接/包含源。
要做到这一点,你必须简单地在你的系统上安装LAPACK和BLAS(如果它们不在那里,在Ubuntu中是libblas-dev
和liblapack-dev
),并将整个includes
目录复制到一个合理的地方例如在$HOME/.local/arma
中。
在matlab控制台中,将环境变量BLAS_VERSION
和LAPACK_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
。
第二个解决方案涉及在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))