
私は数週間私を悩ませていますが、StackExchangeやディスカッション掲示板で答えが見つからない問題の解決策を文書化するためにこの質問を投稿します。 (答えはすぐに提供されます)
Centos7オペレーティングシステムでApplication Compiler Toolbox(Matlab Compiler 6.4)を使用してコンパイルされたMATLABプログラム(MATLAB 2017a)を実行しようとしています。トリッキーな部分は、私のMatlabプログラムが "system"コマンドを使ってRを呼び出し、rmarkdownドキュメントを編むことです。
LinuxオペレーティングシステムでスタンドアロンMATLABプログラムを実行するには、LD_LIBRARY_PATHを次のように設定する必要があります。
export LD_LIBRARY_PATH={$LD_LIBRARY_PATH}:/usr/local/MATLAB/MATLAB_Runtimev92/v92/runtime/glnxa64:/usr/local/MATLAB/MATLAB_Runtimev92/v92/bin/glnxa64:/usr/local/MATLAB/MATLAB_Runtimev92/v92/sys/os/glnxa64:/usr/local/MATLAB/MATLAB_Runtimev92/v92/sys/opengl/lib/glnxa64
問題は、次のようにRが停止することです。
In grDevices::png(f) :
unable to load shared object '/usr/lib64/R/library/grDevices/libs//cairo.so':
/lib64/libcairo.so.2: undefined symbol: FT_Get_Var_Design_Coordinates
Rコードを別々にテストしたところ、sudo権限で実行すると正しく動作することがわかりました。 sudo 権限で実行すると MATLAB プログラムを実行できないため、これは機能しません。
sudo権限がLD_LIBRARY_PATHをクリアしていることがわかりました。LD_LIBRARY_PATH は sudo 以降は常に空です。
私が見つけた1つの解決策は、sudoを使用するようにMATLABのシステムコールを変更することでしたが、プログラムの実行中にユーザーがsudoパスワードを入力する必要があったため、急いで修正しました。だから、より良い解決策を探しています。
答え1
それで、いくつかの調査を行った後、libcairoの問題は実際にはフリータイプの問題であることがわかりました。この問題 -https://stackoverflow.com/questions/60782074/r-issue-unable-to-load-shared-object-cairo-so-on-linux-centos-7- 複数のfreetypeライブラリが問題である可能性があることを示唆していますが、rpm freetypeを実行すると次のようになります。
rpm -q freetype
freetype-2.8-14.el7_9.1.x86_64
freetype-2.8-14.el7_9.1.i686
重複した自由形式ライブラリが見つかりません。
その結果、オペレーティングシステムライブラリの前にLD_LIBRARY_PATHが検索されます。https://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
もちろん、実行してみると、次のようなものが見つかりました。
sudo find / -type f -iname 'libfreetype.so.*'
/usr/lib/libfreetype.so.6.14.0
/usr/lib64/libfreetype.so.6.14.0
/usr/local/bin/glnxa64/libfreetype.so.6.11.1
/usr/local/MATLAB/MATLAB_Runtimev92/v92/bin/glnxa64/libfreetype.so.6.11.1
/usr/local/MATLAB/R2017a/bin/glnxa64/libfreetype.so.6.11.1
rpmが実行できないことが何であるかがわかりました。 MATLABには独自のfreetypeライブラリがあります! LD_LIBRARY_PATHはos freetypeライブラリをオーバーライドします(これがsudoの実行時にRが機能する理由です)。
最も一貫した修正は2つの部分です。
- LD_LIBRARY_PATH がスタンドアロン MATLAB プログラムの元の呼び出しの一部としてのみ設定されていることを確認してください。これは、コンパイル時に生成されたrun_MyProgram.shファイルを介して実行できます。
- MATLABコードで実行する前に、すべての「システム」呼び出しがLD_LIBRARY_PATHをクリアしていることを確認してください。つまり:
function [status,cmdout]=systemAlt(cmd)
if isunix()
[status,cmdout]=system(['export LD_LIBRARY_PATH="";',cmd]);
else
[status,cmdout]=system(cmd);
end
end
奇妙なことは、これを行うには新しいフォントもダウンロードする必要があることです。
yum install xorg-x11-font*
だから私のように詰まっている方がいらっしゃるなら、この文が役に立ってほしいです。