現在、MATLAB2012aのmexはgcc4.4.6のみを公式にサポートしていますが、自己責任でgcc4.7を使用したいと思います。今、私がmexで何かを直接コンパイルすると、それは文句を言うでしょう
/usr/lib/gcc/i686-linux-gnu/4.7/cc1plus:
/usr/local/MATLAB/R2012a/sys/os/glnx86/libstdc++.so.6:
version `GLIBCXX_3.4.15' not found
(required by /usr/lib/i386-linux-gnu/libppl_c.so.4)
/usr/lib/gcc/i686-linux-gnu/4.7/cc1plus:
/usr/local/MATLAB/R2012a/sys/os/glnx86/libstdc++.so.6:
version `GLIBCXX_3.4.15' not found
(required by /usr/lib/i386-linux-gnu/libppl.so.9)
strings /usr/lib/i386-linux-gnu/libstdc++.so.6 | grep 'GLIBCXX'
によってこのlibstdc++.so.6
にそのバージョン文字列があることを確認します。 mexopts.sh
を確認し、そのスクリプトの変数$RPATH
と$MLIBS
を変更しましたが、機能しません。したがって、シンボリックリンクを使用しない場合、mexが使用するlibstdc++.so.6
のパスをどこで構成できますか?ありがとうございました。
Matlabがそれを使用することを認識できるように、gcc4.7ライブラリへのシンボリックリンクを作成する必要があります。何かのようなもの:
ln -s {/path/to/file-name} {link-name}
シンボリックリンクを使用したくない場合は、matlabを起動するターミナルでこのパスを定義するだけです。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/libstdc++.so.6
./matlab
/usr/lib/gcc/i686-linux-gnu/4.7/cc1plus:/usr/local/MATLAB/R2012a/sys/os/glnx86/libstdc++.so.6:バージョン `GLIBCXX_3.4.15 'が見つかりません
問題は、mex
を使用してビルドしている場合、リンク行に-L/usr/local/MATLAB/R2012a/sys/os/glnx86
が配置されるため、リンカーがそこからlibstdc++.so
を取得することです。
mex
に最初に-L/usr/lib/i386-linux-gnu
を追加するように説得できない場合は、/usr/local/MATLAB/R2012a/sys/os/glnx86/libstdc++.so
を削除する以外に方法はないと思います(名前をlibstdc++.so.bak
などに変更するだけです)。
遅い答えですが、Mathworksで承認された最もクリーンで侵襲性の低いソリューションは、.matlab7rc.sh
スクリプトを編集することだと思います。これは、UNIXライクなシステムでMATLABを起動するときにmatlab
スクリプトによって使用されるスクリプトです。 ( http://www.mathworks.ch/ch/help/matlab/ref/matlabunix.html を参照)
そのスクリプト({matlabroot}/bin
の下にあります)をプロジェクトのルートまたはホームディレクトリにコピーします。次に、MATLABに、システムディレクトリで、独自のディレクトリではなく、C++ライブラリを最初に検索するように指示します。私のシステムでは、191行目を変更しました。
191c191
< LDPATH_PREFIX='/usr/lib/x86_64-linux-gnu'
---
> LDPATH_PREFIX=''
(単にLD_LIBRARY_PATH
を空の文字列に設定することは、他のサードパーティライブラリをロードできなくなるため、適切な解決策ではありません。)
これを行うと、mex
を実行すると次のメッセージが表示される場合があります。
/usr/bin/ld: cannot find -lstdc++
これは通常、g++
がインストールされていないことを意味します。 Debianのようなシステムで、以下を実行します。
Sudo apt-get install g++
これ以降、公式にサポートされているバージョンを超えるバージョンのgccを使用することについて迷惑な警告が表示される場合がありますが、それは無害であり、無視できます。
私は両方の答えを試しました..しかし、どれも私のために働きませんでした。
しかし、これは私にとってはうまくいきました。 matlabでこれを実行します-
setenv('LD_LIBRARY_PATH', '');
同じ問題に直面している人のためだけに。
追伸:私はこの解決策を見つけました ここ
Glnx86セクションに行を追加することにより、~/.matlab/R2012a/mexopts.sh
の実行後に生成されたmex -setup
を変更できます。
LD_LIBRARY_PATH='/usr/lib:$LD_LIBRARY_PATH'
またはglnx64で:
LD_LIBRARY_PATH='/usr/lib64:$LD_LIBRARY_PATH'
ルートアクセス権がない場合は、試してみてください。LD_PRELOAD='path/to/libstdc++.so.6.0.21' matlab
Libstdc ++。so.6がどこにあるかを見つけることができなかったため、geek_girlによって提供されたソリューションを完全にテストすることができませんでした。ただし、th1rdey3の変更は機能しました。私はmatlabコンソールで実行しました:
setenv('LD_LIBRARY_PATH', 'usr/lib/jvm/Java-7-openjdk-AMD64/jre/lib/AMD64/server:/usr/lib/jvm/Java-7-openjdk-AMD64/jre/lib/AMD64:/usr/local/MATLAB/R2011a/bin/glnxa64:/usr/lib/boost_1_54_0/libs/regex/build/gcc');
これは、EclipseでC++コードをコンパイルするときに「LD_LIBRARY_PATH」に使用する値です(mexファイルを使用していません。代わりに、EclipseでC++コードの実行可能ファイルを作成し、後でmatlab Shellから実行します)。私の場合、C++コードはboostの正規表現、matlabライブラリ(libmat、libmxなど)、GSLライブラリ、およびArmadilloを使用しているため、「LD_LIBRARY_PATH」の値は非常に長くなります。これらすべてのライブラリを使用しない場合は、setenv( 'LD_LIBRARY_PATH'、 '')で十分だと思います。
Matlab R2015bでは、最初にlibstdc++.so.6
を再リンクし、次に@lindelofによって上記のように.matlab7rc.sh
を編集しました。私のデスクトップでは、ターミナルから:
locate libstdc++.so.6
私の場合、システムライブラリは/usr/lib64
にあります。次に
cd /usr/local/matlab/sys/os/glnxa64
mv libstdc++.so.6 libstdc++.so.6.bak
ln -s /usr/lib64/libstc++.so.6 libstc++.so.6
cd /usr/local/src/matlab/bin/glnxa64/
mv libstdc++.so.6 libstdc++.so.6.bak
ln -s /usr/lib64/libstc++.so.6 libstc++.so.6
次に、.matlab7rc.sh
の{matlabroot}/bin
を編集します。同じディレクトリにあるmexopts.sh
ファイルを削除します。 Matlabを再起動します。 MEX
ファイルを最初から作成します(これにより、新しい設定で新しいmexopts.sh
ファイルが作成されます。Matlabコンソールから実行します。