Wie link bei Matlab die MEX-Zusammenstellung
Ich habe ein Programm geschrieben, in der folgenden form:
#include "stuff_I_need.h"
int main(){
construct_array(); // uses OpenMP pragma's
print_array();
return(0);
}
zusammenstellt, links, und läuft einwandfrei mit dem folgenden Befehl:
`gcc44 -I/home/matteson/sundials/include/ main.c -lm -L/home/matteson/sundials/lib -lsundials_cvode -lsundials_nvecserial -fopenmp -o /home/matteson/MPI_test/CVODE_test/main_test`
"gcc44" ist einfach gcc version 4.4 und heißt so, weil es kompiliert wird, die auf einem cluster, der verwaltet mehrere Versionen des gcc. Die Bibliotheken sundials_cvode und sundials_nvecserial verwendet werden, in der Lösung von mehreren differentialgleichungen bei der Konstruktion des array.
Wenn ich jetzt übertragen möchte über Matlab und versuchen zu kompilieren, die die mex-Datei der form:
#include "stuff_I_need.h"
void mexFunction(int nlhs,mxArray* plhs[], int nrhs, const mxArray* prhs[]){
construct_array(); // uses OpenMP pragma's
print_array();
}
und versuchen zu kompilieren mit folgendem Befehl in Matlab:
>> mex -v CC="gcc44" CFLAGS="\$CFLAGS -I/home/matteson/sundials/include/ -fopenmp" LDFLAGS="\$LDFLAGS -fopenmp -L/home/matteson/sundials/lib -lsundials_cvode -lsundials_nvecserial" mex_cvode.c
Bekomme ich die folgenden Meldungen die Ihren Höhepunkt in einem link-Fehler:
-> mexopts.sh sourced from directory (DIR = $HOME/.matlab/$REL_VERSION)
FILE = /home/matteson/.matlab/R2010b/mexopts.sh
----------------------------------------------------------------
-> MATLAB = /misc/linux/64/opt/pkg/matlab/R2010b
-> CC = gcc44
-> CC flags:
CFLAGS = -ansi -D_GNU_SOURCE -fexceptions -fPIC -fno-omit-frame-pointer -pthread -I/home/matteson/sundials/include/ -L/home/matteson/sundials/lib -lsundials_cvode -L/home/matteson/sundials/lib -lsundials_nvecserial
CDEBUGFLAGS = -g
COPTIMFLAGS = -O -DNDEBUG
CLIBS = -Wl,-rpath-link,/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -L/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -lmx -lmex -lmat -lm -lstdc++
arguments = -DMX_COMPAT_32
-> CXX = g++
-> CXX flags:
CXXFLAGS = -ansi -D_GNU_SOURCE -fPIC -fno-omit-frame-pointer -pthread
CXXDEBUGFLAGS = -g
CXXOPTIMFLAGS = -O -DNDEBUG
CXXLIBS = -Wl,-rpath-link,/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -L/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -lmx -lmex -lmat -lm
arguments = -DMX_COMPAT_32
-> FC = g95
-> FC flags:
FFLAGS = -fexceptions -fPIC -fno-omit-frame-pointer
FDEBUGFLAGS = -g
FOPTIMFLAGS = -O
FLIBS = -Wl,-rpath-link,/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -L/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -lmx -lmex -lmat -lm
arguments = -DMX_COMPAT_32
-> LD = gcc44
-> Link flags:
LDFLAGS = -pthread -shared -Wl,--version-script,/misc/linux/64/opt/pkg/matlab/R2010b/extern/lib/glnxa64/mexFunction.map -Wl,--no-undefined -fopenmpofopenmp
LDDEBUGFLAGS = -g
LDOPTIMFLAGS = -O
LDEXTENSION = .mexa64
arguments =
-> LDCXX =
-> Link flags:
LDCXXFLAGS =
LDCXXDEBUGFLAGS =
LDCXXOPTIMFLAGS =
LDCXXEXTENSION =
arguments =
----------------------------------------------------------------
Warning: You are using gcc version "4.4.4". The version
currently supported with MEX is "4.3.4".
For a list of currently supported compilers see:
http://www.mathworks.com/support/compilers/current_release/
-> gcc44 -c -I/misc/linux/64/opt/pkg/matlab/R2010b/extern/include -I/misc/linux/64/opt/pkg/matlab/R2010b/simulink/include -DMATLAB_MEX_FILE -ansi -D_GNU_SOURCE -fexceptions -fPIC -fno-omit-frame-pointer -pthread -I/home/matteson/sundials/include/ -L/home/matteson/sundials/lib -lsundials_cvode -L/home/matteson/sundials/lib -lsundials_nvecserial -DMX_COMPAT_32 -O -DNDEBUG "mex_cvode.c"
-> gcc44 -O -pthread -shared -Wl,--version-script,/misc/linux/64/opt/pkg/matlab/R2010b/extern/lib/glnxa64/mexFunction.map -Wl,--no-undefined -fopenmpofopenmp -o "mex_cvode.mexa64" mex_cvode.o -Wl,-rpath-link,/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -L/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -lmx -lmex -lmat -lm -lstdc++
mex_cvode.o: In function `mexFunction':
mex_cvode.c:(.text+0x2b2): undefined reference to `N_VNew_Serial'
mex_cvode.c:(.text+0x2db): undefined reference to `N_VNew_Serial'
mex_cvode.c:(.text+0x35b): undefined reference to `CVodeCreate'
mex_cvode.c:(.text+0x39c): undefined reference to `CVodeInit'
mex_cvode.c:(.text+0x3dd): undefined reference to `CVodeSVtolerances'
mex_cvode.c:(.text+0x412): undefined reference to `CVodeSetUserData'
mex_cvode.c:(.text+0x449): undefined reference to `CVDense'
mex_cvode.c:(.text+0x482): undefined reference to `CVDlsSetDenseJacFn'
mex_cvode.c:(.text+0x50c): undefined reference to `CVode'
mex_cvode.c:(.text+0x5b4): undefined reference to `N_VDestroy_Serial'
mex_cvode.c:(.text+0x5c0): undefined reference to `N_VDestroy_Serial'
mex_cvode.c:(.text+0x5cc): undefined reference to `CVodeFree'
collect2: ld returned 1 exit status
mex: link of ' "mex_cvode.mexa64"' failed.
??? Error using ==> mex at 208
Unable to complete successfully.
Irgendwie, ich bin nicht die richtigen flags link entsprechend. Wie bekomme ich den gleichen Satz der Fehler (plus ein paar mehr), wenn ich entfernen Sie die Befehle auf den link in der gcc44 Befehl, ich bin mir ziemlich sicher, dass ich nicht immer der compiler "sieht" den Bibliotheken.
Meine Fragen sind :
- Wenn meine Analyse der Fehler ist zu korrigieren, welche flags muss ich pass zu der mex-Zusammenstellung Befehl erfolgreich link?
- Alternativ, was sind die gcc-flags zum kompilieren und verknüpfen außerhalb der Matlab-Umgebung zu kompilieren .mex64 ausführbare Datei?
- Wenn meine Analyse falsch ist, wo von hier aus gehen?
Ich glaube, ich habe ausgeschlossen, die nicht unterstützte compiler die Warnung, da habe ich in der Lage zu kompilieren einfache mex mit OpenMP-Programme mit gcc 4.4, die aber nicht verknüpfen, die gegen alles mit Ausnahme der Mathematik-Bibliothek. Auch, wenn ich kompilieren mit der version gcc version 4.1.2 oder 4.3.4 mit oder ohne "-fopenmp" flags bekomme ich den gleichen Fehler.
In das Ende ich habe die version 4.4, die aufgrund bestimmter OpenMP-Unterstützung, die nicht in früheren Versionen.
Vielen Dank im Voraus für die Hilfe.
--Andrew
Bearbeitungen: (@KWATFORD)
Also habe ich versucht den Befehl mit den Anweisungen außerhalb der Anführungszeichen, und bekam die Fehlermeldung:
-> gcc44 -c -I/home/matteson/sundials/include/ -I/misc/linux/64/opt/pkg/matlab/R2010b/extern/include -I/misc/linux/64/opt/pkg/matlab/R2010b/simulink/include -DMATLAB_MEX_FILE -ansi -D_GNU_SOURCE -fexceptions -fPIC -fno-omit-frame-pointer -pthread -fopenmp -DMX_COMPAT_32 -O -DNDEBUG "mex_cvode.c"
-> gcc44 -O -pthread -shared -Wl,--version-script,/misc/linux/64/opt/pkg/matlab/R2010b/extern/lib/glnxa64/mexFunction.map -Wl,--no-undefined -fopenmp -o "mex_cvode.mexa64" mex_cvode.o -L/home/matteson/sundials/lib -lsundials_cvode -lsundials_nvecserial -Wl,-rpath-link,/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -L/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -lmx -lmex -lmat -lm -lstdc++
/usr/bin/ld: /home/matteson/sundials/lib/libsundials_cvode.a(cvode.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
/home/matteson/sundials/lib/libsundials_cvode.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
mex: link of ' "mex_cvode.mexa64"' failed.
??? Error using ==> mex at 208
Unable to complete successfully.
Ich bin ein wenig verwirrt über den Vorschlag neu zu kompilieren mit "-fPIC", weil wenn ich mir die gcc44 Befehl, ich sehe die -fPIC-option als eine.
Werden Sie sagen, zum kompilieren der library mit -fPIC?
Habe ich nicht die Quelle für die Bibliothek, falls der Vorschlag wird zum kompilieren der Bibliothek gibt es eine Abhilfe?
Was bedeutet "Umzug gegen lokale Objekt" bedeuten?
Mein weiter Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie nicht, den
-l
,-L
oder-I
Argumente in diesen Umgebungsvariablen. Die mex-Funktion wird mit den Typen der Argumente direkt. Also vielleicht so etwas wie:Kwatford setzte mich auf die richtige Spur mit der zweiten Frage. Ich war in der Lage zu Holen Sie sich die mex-Befehl zu arbeiten, indem Sie den Wiederaufbau der Sonnenuhren solver mit shared libraries. Konkret habe ich gebaut mit:
Vielen Dank auch an kwatford für das Update die original-Aufruf:
da mex weiß, wie mit der -L und -I.
Matlab verwendet seine eigene libstdc und libstdc++.
Die Verknüpfung würde zu tun, ein symbolink zu diesen Bibliotheken die gcc44 Bibliotheken, die Sie verwenden möchten.
Aber dies kann nicht der gewünschte Weg zu gehen. Sie könnten versuchen, kompilieren außerhalb der matlab-Eingabeaufforderung und sehen, wenn es immer noch fehlschlägt, Kompilierung ersten.