【发布时间】:2013-12-12 12:58:41
【问题描述】:
我目前正在尝试为 MATLAB 的数值软件库构建一个接口。因此,我最终遇到了以下问题:
MATLAB 默认使用 64 位整数,其 BLAS 和 LAPACK 库(即 MKL)也仅支持 64 位整数。不幸的是,我想通过 mex 文件连接到 Matlab 的库仅使用 32 位整数及其依赖项。每当 mex 文件现在尝试从 BLAS 或 LAPACK 调用函数时,由于整数宽度不同,它会崩溃。
我尝试使用 32 位整数将我的 mex 文件与我自己的 BLAS 和 LAPACK 版本链接起来
mex myinterface.c -largeArrayDims -llapack -lblas
链接器在 mex 文件中包含对这两个库的引用,但如果我现在从 MATLAB 调用它,它会崩溃。从回溯中,我了解到一个 LAPACK 调用会产生分段错误,这似乎是由不同的整数宽度引起的。此外,回溯告诉我是 MKL 导致了这个错误,而不是我链接到我的程序的 BLAS 和 LAPACK。
问题是:是否有可能将 mex 文件链接到其依赖项,以便它解析其中的符号而不是 MATLAB 中的符号,即使用给定的 BLAS 和 LAPACK 库?
备注:
- MATLAB 2013
- GCC 4.6
- BLAS 和 LAPACK 库是动态的。
【问题讨论】:
-
默认情况下,Matlab 使用 64 位 f-p 数字。诸如
a = 23之类的赋值给a留下一个double。你有没有使用 Matlab 的其他类型成功过,ega = int32(23)? -
我不确定问题是你的想法。首先,64 位应用程序只能加载 64 位共享库。但是,如果您的意思是 MATLAB 定义的
mwIndex和mwSize类型是 32 位还是 64 位,那么请尝试使用mex -compatibleArrayDims ..进行编译。这将强制 32 位整数作为默认大小,即使在 64 位平台上也是如此。 -
同样在编译期间,如果您没有明确指定自己的路径,链接器将查看 MATLAB 自己的 BLAS/LAPACK 版本,而不是您自己的。所以使用类似:
mex -v -I/path/to/include -L/path/to/libs ...,甚至可能是mex -v CFLAGS='-I... -Wall $CFLAGS' LDFLAGS='-L.. -w $LDFLAGS'更确定(或任何其他 GCC 选项使其更详细) -
最后一点:我记得曾经甚至可以替换为整个 MATLAB 会话加载的 BLAS/LAPACK 实现(我认为它是由环境变量或某处的配置文件控制的) ,因此您可以绕过英特尔 MKL 库并加载您自己的(ATLAS、OpenBLAS 等)。但我不确定它是否可能了,所以不要引用我的话:)
-
这是我指的那个:stanford.edu/~echu508/matlab.html。就我个人而言,我从来没有这样做过。
标签: c matlab dynamic-linking