2011-04-18 20 views
2

我試圖規避使用MEX鏈接到MATLAB,只需調用二進制使用「!」如在:`GLIBCXX_3.4.11'找不到,從MATLAB運行系統調用,鏈接到glibc不同於matlab bin路徑

>> !template_image_rigid -args .... 
template_image_rigid: /opt/MatlabR2010a/sys/os/glnxa64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by /usr/lib/libboost_program_options.so.1.40.0) 
template_image_rigid: /opt/MatlabR2010a/sys/os/glnxa64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by /usr/lib/libdirac_encoder.so.0) 

有沒有一種方法可以很容易地解決從MATLAB內動態鏈接問題?我知道我可以使用MATLAB重新編譯源代碼並使用MEX調用,但是由於運行解算器需要一些時間,我只想將它作爲shell命令運行,然後將文本數據導入到MATLAB中。

如果有幫助,源&的CMakeLists.txt可以在這裏找到:https://github.com/pkarasev3/nlmagick/tree/master/samples

回答

2

簡單:

setenv('foo',num2str(some_value)) 
!LD_LIBRARY_PATH="" && ./my_binary -f $foo 
disp('done with external program!') 
+1

嘿,抱歉打擾一個老問題。你能幫我理解什麼是'setenv('foo',num2str(some_value))'在做什麼?它提前;) – Matteo 2012-07-18 08:01:52

+0

它在shell中設置了一個環境變量,所以它可以用於以「!」開頭的後續shell命令中...注意這個例子是linux/unix,對於你需要語法改變的窗口而不是$ – 2012-07-20 01:01:48

+0

我明白... Thks! ;) – Matteo 2012-07-20 06:58:04

2

格兒,社區=失敗。

Diagnoising:從MATLAB中做的gnome-terminal,並期待在 「ENV」:

env | grep Matlab 

這給

XKEYSYMDB=/opt/MatlabR2010a/X11/app-defaults/XKeysymDB 
MATLABPATH=/opt/MatlabR2010a/toolbox/local 
XAPPLRESDIR=/opt/MatlabR2010a/X11/app-defaults 
LD_LIBRARY_PATH=/opt/MatlabR2010a/sys/os/glnxa64:/opt/MatlabR2010a/bin/glnxa64:/opt/MatlabR2010a/extern/lib/glnxa64:/opt/MatlabR2010a/runtime/glnxa64:/opt/MatlabR2010a/sys/java/jre/glnxa64/jre/lib/amd64/native_threads:/opt/MatlabR2010a/sys/java/jre/glnxa64/jre/lib/a md64/server:/opt/MatlabR2010a/sys/java/jre/glnxa64/jre/lib/amd64 
OSG_LD_LIBRARY_PATH=/opt/MatlabR2010a/sys/openscenegraph/lib/glnxa64 
TOOLBOX=/opt/MatlabR2010a/toolbox 
XFILESEARCHPATH=/opt/MatlabR2010a/sys/java/jre/glnxa64/jre/lib/locale/%L/%T/%N%S::/usr/dt/app-defaults/%L/Dt 
MATLAB=/opt/MatlabR2010a 

好所以LD_LIBRARY_PATH是壞的。

絕招:寫一個腳本騷靈和GNOME終端運行,與從MATLAB啓動它:

!./hack.sh RunStuffThatLinksElsewhere 

其中hack.sh是類似的腳本:

#!/bin/bash 
source ~/.bashrc 
export LD_LIBRARY_PATH='' 
gnome-terminal --command="${1}" 

所以一個簡單的測試是「EOG」試試吧,這個黑客得到周圍的鏈接的問題,讓您從MATLAB中運行它...

2

我解決了這個問題,將libstdC++。so.6的版本替換爲我的系統中的新版本(我使用的是Ubuntu 12.04)。

首先找到系統版本的libstdC++。so.6。

在命令行中輸入:

locate libstdc++.so.6 

我的libstdc系統版本是

/usr/lib/i386-linux-gnu/libstdc++.so.6

然後用指向系統libstdc的鏈接替換matlab libstdc版本。

在命令行中鍵入(與你的設置替換[...]):

cd [matlab_dir]/sys/os/glnx86 
mv libstdc++.so.6 libstdc++.so.6-OLD 
ln -s [your_system_version_of_libstdc] libstdc++.so.6 
+1

對於某些版本的Matlab,這可能會導致Matlab可執行文件無法運行。 – shabbychef 2015-04-17 20:24:41

1

我最近遇到了同樣的問題。我的解決方案也使用像其他答案一樣的poltergeist腳本。該腳本如下(poltergeist.sh):

#!/bin/bash 
export LD_LIBRARY_PATH='' 
eval "[email protected]" 

它基本上重置庫路徑,然後評估由腳本變量的給定呼叫。從MATLAB中我再以這種方式撥打:

system([pwd,'/poltergeist.sh echo hello world!']); 

的優勢,這種方法是,你可以動態MATLAB中修改調用命令。據我所知,在當前提供的答案中,使用bang語法是不可能的。