Come dire a mex di collegarsi con libstdc ++. So.6 in / usr / lib invece di quello nella directory MATLAB?

Ora mex in MATLAB 2012a supporta solo ufficialmente gcc 4.4.6 ma voglio usare gcc 4.7 a proprio rischio. Ora se compilo qualcosa con mex direttamente, si lamenterà

/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) 

Con le strings /usr/lib/i386-linux-gnu/libstdc++.so.6 | grep 'GLIBCXX' strings /usr/lib/i386-linux-gnu/libstdc++.so.6 | grep 'GLIBCXX' Confermo che questo libstdc++.so.6 ha quella stringa di versione. Ho rivisto mexopts.sh e modificato la variabile $RPATH e $MLIBS in quello script, ma non funziona. Quindi, se non utilizzo il collegamento simbolico, dove posso configurare il percorso di libstdc++.so.6 che usa mex? Grazie.

È necessario creare un collegamento simbolico alla libreria gcc 4.7 in modo che MATLAB possa usarlo. Qualcosa di simile a:

 ln -s {/path/to/file-name} {link-name} 

Se non si desidera utilizzare collegamenti simbolici, è sufficiente definire questo percorso in un terminale da cui si avvia 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: versione `GLIBCXX_3.4.15 ‘non trovata

Il problema è che quando si costruisce con mex , mette -L/usr/local/MATLAB/R2012a/sys/os/glnx86 sulla linea di collegamento, e così il linker prende libstdc++.so da lì.

Se non riesci a convincere mex a anteporre prima a -L/usr/lib/i386-linux-gnu , allora penso che la tua unica altra scelta sia quella di rimuovere /usr/local/MATLAB/R2012a/sys/os/glnx86/libstdc++.so (basta rinominarlo ad esempio libstdc++.so.bak ).

È una risposta tardiva, ma credo che la soluzione più pulita, la maggior parte delle Mathworks e meno invasiva sia quella di modificare lo script .matlab7rc.sh . Questo è uno script usato dallo script matlab quando si avvia MATLAB sotto sistemi UNIX-like. (Vedi http://www.mathworks.ch/ch/help/matlab/ref/matlabunix.html )

Copia quello script (trovato sotto {matlabroot}/bin ) nella radice del tuo progetto, o nella tua home directory. Quindi comunica a MATLAB di cercare prima nelle directory di sistema per le librerie C ++, invece che nelle sue directory. Sul mio sistema ho cambiato la linea 191:

 191c191 < LDPATH_PREFIX='/usr/lib/x86_64-linux-gnu' --- > LDPATH_PREFIX='' 

(Semplicemente impostando LD_LIBRARY_PATH sulla stringa vuota non è una buona soluzione, perché ciò impedirà il caricamento di altre librerie di terze parti.)

Quando questo è fatto si potrebbe ottenere il seguente messaggio quando si esegue mex :

 /usr/bin/ld: cannot find -lstdc++ 

Questo di solito significa che g++ non è installato. Su un sistema simile a Debian, esegui:

 sudo apt-get install g++ 

Da qui in poi, potresti comunque ricevere un fastidioso avviso sull’utilizzo di una versione di gcc oltre a quella ufficialmente supportata, ma che è innocua e può essere ignorata.

ho provato entrambe le risposte .. ma nessuno ha funzionato per me.

comunque questo ha funzionato per me. in matlab esegui questo –

 setenv('LD_LIBRARY_PATH', ''); 

solo per chi ha di fronte lo stesso problema.

PS: ho trovato questa soluzione qui

È ansible modificare ~/.matlab/R2012a/mexopts.sh che viene generato dopo aver eseguito mex -setup aggiungendo una linea nella sezione glnx86:

 LD_LIBRARY_PATH='/usr/lib:$LD_LIBRARY_PATH' 

o in glnx64:

 LD_LIBRARY_PATH='/usr/lib64:$LD_LIBRARY_PATH' 

Non ero in grado di trovare dov’è il mio libstdc ++. So.6, quindi non ero in grado di testare completamente la soluzione fornita da geek_girl. Tuttavia, una modifica di th1rdey3 ha funzionato. Ho eseguito la console 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'); 

Questo è il valore che uso per ‘LD_LIBRARY_PATH’ quando compilo il mio codice C ++ in Eclipse (non sto usando i file mex, invece creo un eseguibile del mio codice C ++ in Eclipse e successivamente lo eseguo dalla shell matlab). Nel mio caso il valore di ‘LD_LIBRARY_PATH’ è così lungo perché il mio codice C ++ usa la regex di boost, le librerie MATLAB (libmat, libmx e così via), la libreria GSL e Armadillo. Se non usi tutte queste librerie, setenv (‘LD_LIBRARY_PATH’, ”) dovrebbe essere sufficiente, immagino.

Su Matlab R2015b, ho prima ricollegato libstdc++.so.6 e poi modificato .matlab7rc.sh come descritto sopra da @lindelof. Sul mio desktop, dal terminale:

 locate libstdc++.so.6 

Nel mio caso, la libreria di sistema si trova in /usr/lib64 . Poi

 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 

Quindi modifica .matlab7rc.sh in {matlabroot}/bin . Elimina nella stessa directory qualsiasi file mexopts.sh . Riavvia Matlab. MEX tuo file da zero (questo costruirà un nuovo file mexopts.sh con le nuove impostazioni. mexopts.sh dalla console Matlab.

Se non hai accesso root, puoi provare,
LD_PRELOAD='path/to/libstdc++.so.6.0.21' matlab