Ich versuche, eine Matlab Mex-Funktion zu schreiben, die libhdf5 verwendet; Meine Linux-Installation bietet libhdf5-1.8 shared libraries und headers. Allerdings bietet meine Version von Matlab, r2007b, eine libhdf5.so von der Version 1.6. (Matlab .mat
Dateien bootstrap hdf5, offenbar). Wenn ich das mex kompiliere, segregiert es in Matlab. Wenn ich meine Version von libhdf5 auf 1.6 heruntersetze (keine langfristige Option), kompiliert der Code und läuft gut.shared Bibliothek Standorte für Matlab Mex-Dateien:
frage: wie löse ich dieses problem? Wie kann ich den Mex-Kompilierungsprozess so erklären, dass er gegen /usr/lib64/libhdf5.so.6 anstelle von /opt/matlab/bin/glnxa64/libhdf5.so.0 verlinkt? Wenn ich versuche, dies mit -Wl,-rpath-link,/usr/lib64
in meiner Sammlung zu tun, erhalte ich Fehler wie:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: warning: libhdf5.so.0, needed by /opt/matlab/matlab75/bin/glnxa64/libmat.so, may conflict with libhdf5.so.6
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status
mex: link of 'hdf5_read_strings.mexa64' failed.
make: *** [hdf5_read_strings.mexa64] Error 1
ack. Der letzte Ausweg wäre, eine lokale Kopie der hdf5-1.6.5-Header herunterzuladen und damit fertig zu werden, aber das ist nicht zukunftssicher (ein Matlab-Versions-Upgrade ist in meiner Zukunft.). irgendwelche Ideen?
EDIT: pro Ramashalanka ausgezeichneten Vorschläge, ich
A) genannt mex -v
die 3 gcc
Befehle zu erhalten; der letzte ist der Linker-Befehl;
B) diesen Linker-Befehl mit einer -v
aufgerufen, um den Befehl collect
zu erhalten;
C) genannt collect2 -v -t
und der Rest der Flags.
Die relevanten Teile meiner Ausgabe:
/usr/bin/ld: mode elf_x86_64
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crti.o
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/crtbeginS.o
hdf5_read_strings.o
mexversion.o
-lmx (/opt/matlab/matlab75/bin/glnxa64/libmx.so)
-lmex (/opt/matlab/matlab75/bin/glnxa64/libmex.so)
-lhdf5 (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/libhdf5.so)
/lib64/libz.so
-lm (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/libm.so)
-lstdc++ (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/libstdc++.so)
-lgcc_s (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/libgcc_s.so)
/lib64/libpthread.so.0
/lib64/libc.so.6
/lib64/ld-linux-x86-64.so.2
-lgcc_s (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/libgcc_s.so)
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/crtendS.o
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crtn.o
in der Tat so, die libhdf5.so
von /usr/lib64
verwiesen wird. Dies wird jedoch, glaube ich, durch die Umgebungsvariable LD_LIBRARY_PATH
überschrieben, die meine Version von Matlab automatisch zur Laufzeit festlegt, so dass sie ihre eigenen Versionen von z. libmex.so
usw.
Ich denke, dass das crt_file.c
Beispiel funktioniert entweder b/c es Ich benutze nicht die Funktionen (H5DOpen
, die 1,6 bis 1,8 (ja in der Bewegung eine Signatur Änderung hatte, ich benutze -DH5_USE_16_API
)), oder, weniger wahrscheinlich, b/c trifft es nicht die Teile von Matlab Interna, die hdf5 benötigen. ack.
In Ihrer Ausgabe Ich sehe 'lib64/libhdf5.so', die eine dynamische Bibliothek ist. Sie müssen den expliziten Pfad für die statische Bibliothek angeben (mit einem Suffix .o) und nicht -lhdf5 verwenden. Dann post neu Linker-Ausgabe, wenn es immer noch nicht funktioniert. Wenn die '.so' Datei die einzige in der Liste ist, dann ist das die einzige. 'LD_LIBRARY_PATH' oder ein anderer Pfad, wie in' -L', sollte keine Rolle spielen, wenn Sie nicht '-lhdf5' als Option haben und Sie den Pfad zur statischen Bibliothek explizit angeben (siehe unten). Ich stimme Ihren Kommentaren zu 'h5_crtfile.c' zu, aber alle Informationen, die wir benötigen, finden Sie oben in Ihrer Linker-Ausgabe. – Ramashalanka
Ich habe keine 'libhdf5.o' Datei; Das hdf5-Paket von gentoo bietet 'libhdf5.so',' libhdf5.a', 'libhdf5.la' und einige Fortran- und CPP-Dateien. Muss ich libhdf5 selbst kompilieren? das ist eine Option ... – shabbychef
Entschuldigung, ich meinte '.a', nicht' .o'. Sie können überprüfen, ob die Datei "libhdf5.a", die Sie haben, die richtige Version ist, z. 'strings libhdf5.a'. Ich sehe "HDF5 Version: 1.8.4" in meinem. Wenn Sie die richtige statische Bibliothek nicht als Binärdatei erhalten können, ist es einfach zu kompilieren. Siehe meine Kommentare zu Ihrer anderen Abfrage unten. – Ramashalanka