【发布时间】:2012-08-30 16:06:41
【问题描述】:
我正在尝试学习如何使用 C API 来读取 Matlab .mat 文件,但它没有按我的预期工作:
我只想打开一个名为test.mat 的非常简单的.mat 文件,从文件中读取一个值并将其存储在一个C 变量中。我使用以下命令在 Matlab 中创建了test.mat:
> value = 3;
> save ("test.mat", "value")
下面是我的 C 代码,它甚至无法编译 - 编译器似乎找不到头文件。请参阅下面的编译器输出代码。我在这里做错了什么?
代码:
#include <stdlib.h>
#include <stdio.h>
#include <mat.h>
#include <matrix.h>
int main(int argc, char *argv[]) {
double value;
MATFile *datafile;
datafile = matOpen("test.mat", "r");
mxArray *mxValue;
mxValue = matGetVariable(datafile, "value");
matClose(datafile);
value = *mxGetPr(mxArray);
mxFree(mxArray);
printf("The value fetched from the .mat file was: %f", value);
return 0;
}
编译器输出:
$ make animate_shot
cc -I/usr/local/MATLAB/R2011a/extern/include/ animate_shot.c -o animate_shot
/tmp/cczrh1vT.o: In function `main':
animate_shot.c:(.text+0x1a): undefined reference to `matOpen'
animate_shot.c:(.text+0x2f): undefined reference to `matGetVariable'
animate_shot.c:(.text+0x3f): undefined reference to `matClose'
animate_shot.c:(.text+0x4b): undefined reference to `mxGetPr'
animate_shot.c:(.text+0x5e): undefined reference to `mxFree'
collect2: ld returned 1 exit status
make: *** [animate_shot] Error 1
(-I 标志在我的 makefile 中使用 CPPFLAGS=-I/usr/local/MATLAB/R2011a/extern/include/ 行指定,并且我已验证该目录存在并包含头文件 mat.h 和 matrix.h)。
更新:
我发现我需要链接的库是libmat.so 和libmx.so(根据this MathWorks help article),位于我系统上的/usr/local/MATLAB/R2011a/bin/glnxa64/。因此,我将我的 makefile 更新为:
CPPFLAGS =-I/usr/local/MATLAB/R2011a/extern/include/
LDFLAGS = -L/usr/local/MATLAB/R2011a/bin/glnxa64 -l mat -l mx
现在,运行 make 会给出以下命令:
cc -I/usr/local/MATLAB/R2011a/extern/include/ -L/usr/local/MATLAB/R2011a/bin/glnxa64 -l mat -l mx animate_shot.c -o animate_shot
但是,我仍然遇到同样的错误。有什么想法吗?
【问题讨论】: