8

.matC API を使用して Matlabファイルを読み取る方法を学習しようとしていますが、期待どおりに動作しません。

.matという非常に単純なファイルを開き、test.matファイルから値を読み取り、C 変数に格納したいと思います。test.mat次のコマンドを使用して、Matlab で作成しました。

> 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 フラグはCPPFLAGS=-I/usr/local/MATLAB/R2011a/extern/include/、makefile の行で指定されており、ディレクトリが存在し、ヘッダー ファイルmat.hとが含まれていることを確認しましたmatrix.h)。

更新:
リンクする必要があるライブラリはlibmat.solibmx.so(この MathWorks ヘルプ記事/usr/local/MATLAB/R2011a/bin/glnxa64/によると)私のシステムに存在することがわかりました。したがって、メイクファイルを次のように更新しました。

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

ただし、それでも同じエラーが発生します。何か案は?

4

1 に答える 1

7

これはリンカーの障害であり、コンパイラーの障害ではありません(-Iコンパイラーのオプションとは関係ありません)。フラグを.so使用してmatlabファイルが配置されているディレクトリを指定し、matlabライブラリの名前を指定するコンパイラコマンドの最後にオプションを追加する必要があります。-L-l<matlab-lib-name>

例えば:

cc -I / usr / local / MATLAB / R2011a / extern / include / -L / usr / local / MATLAB / R2011a / lib animate_shot.c -o animate_shot -lmatlab

(.soが配置されている正確なディレクトリやmatlabライブラリの名前はわかりません)


詳細情報を提供するコメントに基づく:

cc -I / usr / local / MATLAB / R2011a / extern / include / -L / usr / local / MATLAB / R2011a / bin / glnxa64 animate_shot.c -o animate_shot -lmat -lmx

于 2012-08-30T16:09:41.963 に答える