J'essaye d'écrire une fonction matlab mex qui utilise libhdf5; Mon installation Linux fournit des bibliothèques et des en-têtes partagés libhdf5-1.8. Cependant, ma version de Matlab, r2007b, fournit un libhdf5.so de la version 1.6. (Matlab .mat
fichiers bootstrap hdf5, évidemment). Quand je compile le mex, ça segmente dans Matlab. Si je rétrograde ma version de libhdf5 à 1,6 (pas une option à long terme), le code compile et fonctionne bien.emplacements de bibliothèque partagés pour les fichiers matlab mex:
question: comment résoudre ce problème? Comment puis-je dire au processus de compilation mex de lier avec /usr/lib64/libhdf5.so.6 au lieu de /opt/matlab/bin/glnxa64/libhdf5.so.0? Lorsque je tente de le faire en utilisant -Wl,-rpath-link,/usr/lib64
dans ma compilation, je reçois des erreurs telles que:
/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. le dernier recours consisterait à télécharger une copie locale des en-têtes hdf5-1.6.5 et à en faire usage, mais ce n'est pas une preuve du futur (une mise à jour de la version Matlab est dans mon futur). des idées?
EDIT: par d'excellentes suggestions de Ramashalanka, je
A) appelé mex -v
pour obtenir les 3 gcc
commandes; le dernier est la commande de l'éditeur de liens; B) a appelé cette commande de liaison avec un -v
pour obtenir la commande collect
; C) appelé collect2 -v -t
et le reste des drapeaux.
Les parties pertinentes de ma sortie:
/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
Donc, en fait, est en cours référencent libhdf5.so
de /usr/lib64
. Cependant, je crois que ceci est remplacé par la variable d'environnement LD_LIBRARY_PATH
, que ma version de Matlab définit automagiquement au moment de l'exécution afin qu'elle puisse localiser ses propres versions, par ex. libmex.so
, etc.
Je pense que l'exemple crt_file.c
fonctionne soit b/c ne pas utiliser les fonctions que je utilise (H5DOpen
, qui a eu un changement de signature dans le passage de 1,6 à 1,8 (oui, je me sers -DH5_USE_16_API
)), ou, moins probable, b/c il ne frappe pas les parties des internes de Matlab qui ont besoin de hdf5. ack.
Dans votre sortie je vois 'lib64/libhdf5.so' qui est une bibliothèque dynamique. Vous devez spécifier le chemin explicite pour la bibliothèque statique (avec un suffixe .o) et ne pas utiliser '-lhdf5'. Ensuite, publiez une nouvelle sortie de l'éditeur de liens si elle ne fonctionne toujours pas. Si le fichier '.so' est le seul dans la liste alors c'est le seul inclus. 'LD_LIBRARY_PATH' ou n'importe quel autre chemin, comme dans' -L' ne devrait pas avoir d'importance si vous n'avez pas '-lhdf5' en option et vous spécifiez explicitement le chemin vers la bibliothèque statique (voir ci-dessous). Je suis d'accord avec vos commentaires sur 'h5_crtfile.c', mais toutes les informations dont nous avons besoin sont dans la sortie de votre éditeur de liens ci-dessus. – Ramashalanka
Je n'ai pas de fichier 'libhdf5.o'; Le paquetage hdf5 de gentoo fournit 'libhdf5.so',' libhdf5.a', 'libhdf5.la', et quelques fichiers fortran et cpp. Dois-je compiler libhdf5 moi-même? C'est une option ... – shabbychef
Désolé, je voulais dire '.a', pas' .o'. Vous pouvez vérifier que le fichier 'libhdf5.a' que vous avez est la bonne version par exemple. 'chaînes de caractères libhdf5.a'. Je vois «Version HDF5: 1.8.4» dans le mien. Si vous ne pouvez pas obtenir la bonne bibliothèque statique en tant que binaire, il est facile à compiler. Voir mes commentaires à votre autre requête ci-dessous. – Ramashalanka