2011-02-07 8 views
7

のMatlabのMEXのコンパイル時にリンクする方法:私は次の形式のプログラムを書いた

`gcc44 -I/home/matteson/sundials/include/ main.c -lm -L/home/matteson/sundials/lib -lsundials_cvode -lsundials_nvecserial -fopenmp -o /home/matteson/MPI_test/CVODE_test/main_test` 

「gcc44:リンク、コンパイルし、次のコマンドで正しく動作

#include "stuff_I_need.h" 

int main(){ 

construct_array(); // uses OpenMP pragma's 
print_array(); 

return(0); 


} 

"は単純にgccバージョン4.4であり、gccのいくつかのバージョンを維持するクラスタ上でコンパイルされているため、このように命名されています。ライブラリsundials_cvodeとsundials_nvecserialは、配列の構築中にいくつかの微分方程式を解くのに使用されます。

#include "stuff_I_need.h" 

void mexFunction(int nlhs,mxArray* plhs[], int nrhs, const mxArray* prhs[]){ 

construct_array(); // uses OpenMP pragma's 
print_array(); 

} 

とMATLABで次のコマンドを使用してコンパイルしよう:

>> mex -v CC="gcc44" CFLAGS="\$CFLAGS -I/home/matteson/sundials/include/ -fopenmp" LDFLAGS="\$LDFLAGS -fopenmp -L/home/matteson/sundials/lib -lsundials_cvode -lsundials_nvecserial" mex_cvode.c 

I今、私はMatlabのにオーバー転送し、フォームのMEXファイルをコンパイルしようとするときに

リンクエラーが発生すると次のメッセージが表示されます。

-> mexopts.sh sourced from directory (DIR = $HOME/.matlab/$REL_VERSION) 
    FILE = /home/matteson/.matlab/R2010b/mexopts.sh 
---------------------------------------------------------------- 
-> MATLAB    = /misc/linux/64/opt/pkg/matlab/R2010b 
-> CC     = gcc44 
-> CC flags: 
     CFLAGS    = -ansi -D_GNU_SOURCE -fexceptions -fPIC -fno-omit-frame-pointer -pthread -I/home/matteson/sundials/include/ -L/home/matteson/sundials/lib -lsundials_cvode -L/home/matteson/sundials/lib -lsundials_nvecserial 
     CDEBUGFLAGS  = -g 
     COPTIMFLAGS  = -O -DNDEBUG 
     CLIBS    = -Wl,-rpath-link,/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -L/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -lmx -lmex -lmat -lm -lstdc++ 
     arguments   = -DMX_COMPAT_32 
-> CXX     = g++ 
-> CXX flags: 
     CXXFLAGS   = -ansi -D_GNU_SOURCE -fPIC -fno-omit-frame-pointer -pthread 
     CXXDEBUGFLAGS  = -g 
     CXXOPTIMFLAGS  = -O -DNDEBUG 
     CXXLIBS   = -Wl,-rpath-link,/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -L/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -lmx -lmex -lmat -lm 
     arguments   = -DMX_COMPAT_32 
-> FC     = g95 
-> FC flags: 
     FFLAGS    = -fexceptions -fPIC -fno-omit-frame-pointer 
     FDEBUGFLAGS  = -g 
     FOPTIMFLAGS  = -O 
     FLIBS    = -Wl,-rpath-link,/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -L/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -lmx -lmex -lmat -lm 
     arguments   = -DMX_COMPAT_32 
-> LD     = gcc44 
-> Link flags: 
     LDFLAGS   = -pthread -shared -Wl,--version-script,/misc/linux/64/opt/pkg/matlab/R2010b/extern/lib/glnxa64/mexFunction.map -Wl,--no-undefined -fopenmpofopenmp 
     LDDEBUGFLAGS  = -g 
     LDOPTIMFLAGS  = -O 
     LDEXTENSION  = .mexa64 
     arguments   = 
-> LDCXX     = 
-> Link flags: 
     LDCXXFLAGS   = 
     LDCXXDEBUGFLAGS = 
     LDCXXOPTIMFLAGS = 
     LDCXXEXTENSION  = 
     arguments   = 
---------------------------------------------------------------- 


Warning: You are using gcc version "4.4.4". The version 
     currently supported with MEX is "4.3.4". 
     For a list of currently supported compilers see: 
     http://www.mathworks.com/support/compilers/current_release/ 

-> gcc44 -c -I/misc/linux/64/opt/pkg/matlab/R2010b/extern/include -I/misc/linux/64/opt/pkg/matlab/R2010b/simulink/include -DMATLAB_MEX_FILE -ansi -D_GNU_SOURCE -fexceptions -fPIC -fno-omit-frame-pointer -pthread -I/home/matteson/sundials/include/ -L/home/matteson/sundials/lib -lsundials_cvode -L/home/matteson/sundials/lib -lsundials_nvecserial -DMX_COMPAT_32 -O -DNDEBUG "mex_cvode.c" 

-> gcc44 -O -pthread -shared -Wl,--version-script,/misc/linux/64/opt/pkg/matlab/R2010b/extern/lib/glnxa64/mexFunction.map -Wl,--no-undefined -fopenmpofopenmp -o "mex_cvode.mexa64" mex_cvode.o -Wl,-rpath-link,/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -L/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -lmx -lmex -lmat -lm -lstdc++ 

mex_cvode.o: In function `mexFunction': 
mex_cvode.c:(.text+0x2b2): undefined reference to `N_VNew_Serial' 
mex_cvode.c:(.text+0x2db): undefined reference to `N_VNew_Serial' 
mex_cvode.c:(.text+0x35b): undefined reference to `CVodeCreate' 
mex_cvode.c:(.text+0x39c): undefined reference to `CVodeInit' 
mex_cvode.c:(.text+0x3dd): undefined reference to `CVodeSVtolerances' 
mex_cvode.c:(.text+0x412): undefined reference to `CVodeSetUserData' 
mex_cvode.c:(.text+0x449): undefined reference to `CVDense' 
mex_cvode.c:(.text+0x482): undefined reference to `CVDlsSetDenseJacFn' 
mex_cvode.c:(.text+0x50c): undefined reference to `CVode' 
mex_cvode.c:(.text+0x5b4): undefined reference to `N_VDestroy_Serial' 
mex_cvode.c:(.text+0x5c0): undefined reference to `N_VDestroy_Serial' 
mex_cvode.c:(.text+0x5cc): undefined reference to `CVodeFree' 
collect2: ld returned 1 exit status 

    mex: link of ' "mex_cvode.mexa64"' failed. 

??? Error using ==> mex at 208 
Unable to complete successfully. 

どういうわけか、私はcorrec適切にリンクするフラグ。 gcc44コマンドでリンクするコマンドを削除すると、同じエラーが発生する(さらにいくつかのことがあります)ので、私はコンパイラにライブラリを見させないと確信しています。

私の質問は以下のとおりです。エラーの私の分析が正しければ

  • 、何のフラグIが正常にリンクするMEXコンパイルコマンドに渡す必要がありますか?
  • また、Matlab環境の外部でコンパイルしてリンクするgccフラグは、.mex64実行ファイルをコンパイルするためには何ですか?
  • 私の分析が間違っている場合、ここからどこに行くのですか?

私はgcc 4.4を使ってOpenMPプログラムで単純なmexをコンパイルすることができたので、サポートされていないコンパイラ警告を除外したと思いますが、これらは数学ライブラリ以外にリンクする必要はありません。また、 "-fopenmp"フラグの有無にかかわらず、バージョンgccバージョン4.1.2または4.3.4でコンパイルすると、同じエラーが発生します。

最後に、以前のバージョンでは表示されなかった特定のOpenMPサポートのため、バージョン4.4が必要です。

ご協力いただきありがとうございます。

--Andrew

編集:(@KWATFORD)

だから私は、引用符の外のステートメントを使用してコマンドを試みたが、エラーが発生しました:

-> gcc44 -c -I/home/matteson/sundials/include/ -I/misc/linux/64/opt/pkg/matlab/R2010b/extern/include -I/misc/linux/64/opt/pkg/matlab/R2010b/simulink/include -DMATLAB_MEX_FILE -ansi -D_GNU_SOURCE -fexceptions -fPIC -fno-omit-frame-pointer -pthread -fopenmp -DMX_COMPAT_32 -O -DNDEBUG "mex_cvode.c" 

-> gcc44 -O -pthread -shared -Wl,--version-script,/misc/linux/64/opt/pkg/matlab/R2010b/extern/lib/glnxa64/mexFunction.map -Wl,--no-undefined -fopenmp -o "mex_cvode.mexa64" mex_cvode.o -L/home/matteson/sundials/lib -lsundials_cvode -lsundials_nvecserial -Wl,-rpath-link,/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -L/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -lmx -lmex -lmat -lm -lstdc++ 

/usr/bin/ld: /home/matteson/sundials/lib/libsundials_cvode.a(cvode.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC 
/home/matteson/sundials/lib/libsundials_cvode.a: could not read symbols: Bad value 
collect2: ld returned 1 exit status 

    mex: link of ' "mex_cvode.mexa64"' failed. 

??? Error using ==> mex at 208 
Unable to complete successfully. 

私は私はgcc44コマンドを見るとオプションとして-fPICが表示されるので、 "-fPIC"で再コンパイルするという提案について混乱しています。

ライブラリを-fPICで再コンパイルすると言っていますか?

私はライブラリのソースを持っていませんが、ライブラリを再コンパイルすることをお勧めしますか?

「ローカルオブジェクトに対する再配置」は何を意味しますか?

私は継続的に感謝します。

答えて

5

これらの環境変数には、-l-L、または-I引数を入れないでください。 mex関数は、これらの型の引数を直接扱います。だから、おそらく何かのように:

mex -v CC="gcc44" CFLAGS="\$CFLAGS -fopenmp" LDFLAGS="\$LDFLAGS -fopenmp" -I/home/matteson/sundials/include/ -L/home/matteson/sundials/lib -lsundials_cvode -lsundials_nvecserial mex_cvode.c 
+1

私はコマンドを試してみましたが、別のエラーが発生しました。新しい問題を示すために質問を編集しました。ご協力いただきありがとうございます。 – Sevenless

+1

@Svless:申し訳ありませんが、ソースにアクセスできない場合、私はこの新しいエラーをどのように解決できるか分かりません。これは私が扱う方法より深い魔法ですが、それの要点は:(mexファイルのような)共有ライブラリは、何らかの任意の位置に読み込まれるので、独立している必要があります。リンクしようとしている静的ライブラリは位置に依存しているため、どのメモリ・ロケーションにも正しくロードできません。それは再コンパイルする必要があります。 – kwatford

+1

私はシステム管理者でソースを追いかけ、共有オプションでソルバーを作り直しました。それは今働いている。オリジナルの修正とライブラリを使って正しい軌道に乗せてくれてありがとう。 – Sevenless

0

Matlabは独自のlibstdcとlibstdC++を使用しています。

ショートカットは、使用するgcc44ライブラリのライブラリへのシンボリックリンクを行うことです。

しかし、これは望む方法ではないかもしれません。あなたは、外部のMATLABプロンプトを試してみて、まだコンパイルが失敗したかどうかを確認することができます。

4

クワットフォードは2番目の質問と正しいトラックに私を入れた。私は共有ライブラリを使って日時計ソルバーを再構築することによってmexコマンドを動作させることができました。具体的には、私が構築された:

% make distclean 
% ./configure --prefix=/home/matteson/sundials --enable-shared 
% make 
% make install 

また、感謝を呼び出すことにより、元の修正のためにkwatfordする:

mex -v CC="gcc44" CFLAGS="\$CFLAGS -fopenmp" LDFLAGS="\$LDFLAGS -fopenmp" -I/home/matteson/sundials/include/ -L/home/matteson/sundials/lib -lsundials_cvode -lsundials_nvecserial mex_cvode.c 

をMEXは、-Lおよび-Iを処理する方法を知っているから。

関連する問題