web-dev-qa-db-ja.com

MATLABディレクトリにあるものではなく/ usr / libにあるlibstdc ++。so.6にリンクするようにmexに指示するにはどうすればよいですか?

現在、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のパスをどこで構成できますか?ありがとうございました。

12
ziyuang

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
10
geek_girl

/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などに変更するだけです)。

12

遅い答えですが、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を使用することについて迷惑な警告が表示される場合がありますが、それは無害であり、無視できます。

8
lindelof

私は両方の答えを試しました..しかし、どれも私のために働きませんでした。

しかし、これは私にとってはうまくいきました。 matlabでこれを実行します-

setenv('LD_LIBRARY_PATH', '');

同じ問題に直面している人のためだけに。

追伸:私はこの解決策を見つけました ここ

2
th1rdey3

Glnx86セクションに行を追加することにより、~/.matlab/R2012a/mexopts.shの実行後に生成されたmex -setupを変更できます。

LD_LIBRARY_PATH='/usr/lib:$LD_LIBRARY_PATH'

またはglnx64で:

LD_LIBRARY_PATH='/usr/lib64:$LD_LIBRARY_PATH'
2
user1533059

ルートアクセス権がない場合は、試してみてください。
LD_PRELOAD='path/to/libstdc++.so.6.0.21' matlab

1
neeraj battan

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'、 '')で十分だと思います。

0
Alejo NH

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コンソールから実行します。

0
maurizio