emplacements de bibliothèque partagés pour les fichiers matlab mex:
Je suis en train d'écrire un matlab mex fonction qui utilise libhdf5; Mon installation de Linux fournit libhdf5-1.8 bibliothèques partagées et les en-têtes. Cependant, ma version de Matlab, r2007b, fournit un libhdf5.donc, à partir de la version 1.6. (Matlab .mat
fichiers bootstrap hdf5, évidemment). Quand je compile le mex, il segmentation dans Matlab. Si je downgrade ma version de libhdf5 à 1,6 (pas une option à long terme), le code compile et s'exécute correctement.
question: comment puis-je résoudre ce problème? comment puis-je dire au mex processus de compilation pour le lier avec /usr/lib64/libhdf5..6 au lieu de /opt/matlab/bin/glnxa64/libhdf5..0 ? Quand j'essaie de le faire à l'aide de -Wl,-rpath-link,/usr/lib64
dans ma compilation, j'obtiens une erreur comme:
/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
accusé de réception. le dernier recours serait de télécharger une copie locale de la hdf5-1.6.5 les en-têtes et être fait avec elle, mais ce n'est pas l'épreuve de l'avenir (Matlab version de mise à niveau est à mon avenir.). des idées?
EDIT: par Ramashalanka d'excellentes suggestions, je
A) appelé mex -v
pour obtenir les 3 gcc
commandes; le dernier est l'éditeur de liens de commande;
B) disant que l'éditeur de liens de commande avec un -v
pour obtenir le collect
de commande;
C) disant que 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, le libhdf5.so
de /usr/lib64
est référencé. Cependant, c'est d'être surchargée, je crois, par la variable d'environnement LD_LIBRARY_PATH
qui ma version de Matlab définit automatiquement au moment de l'exécution de sorte qu'il peut localiser ses propres versions, par exemple, de libmex.so
etc.
Je pense que le crt_file.c
exemple fonctionne soit en b/c il n'utilise pas les fonctions, je suis en utilisant (H5DOpen
qui a eu un changement de signature dans le déplacement de 1,6 à 1,8 (oui, je suis en utilisant -DH5_USE_16_API
)), ou, moins vraisemblablement, b/c il ne touche pas les parties de Matlab internes qui doivent hdf5. accusé de réception.
source d'informationauteur shabbychef | 2010-02-02
Vous devez vous connecter pour publier un commentaire.
La suite travaillé sur mon système:
Installer hdf5 version 1.8.4 (vous l'avez déjà fait: j'ai installé la source et compilé pour vous assurer qu'il est compatible avec mon système, que je reçois des versions de gcc et que je reçois les bibliothèques statiques - par exemple, les fichiers binaires offert pour mon système sont
icc
spécifiques).Faire un fichier cible. Vous avez déjà votre propre fichier. J'ai utilisé le simple
h5_crtfile.c
de ici (une bonne idée de commencer avec ce simple fichier d'abord un coup d'oeil pour les mises en garde). J'ai changémain
àmexFunction
avec les habituels arguments et inclusmex.h
.Spécifier le statique 1.8.4 bibliothèque que vous souhaitez charger explicitement (le chemin d'accès complet sans -L pour nécessaire) et ne comprennent pas les
-lhdf5
dans leLDFLAGS
. Inclure un-t
option de sorte que vous pouvez s'assurer qu'il n'y a pas de dynamique hdf5 de la bibliothèque en cours de chargement. Vous avez également besoin d'-lz
aveczlib
installé. Pour darwin, nous avons également besoin d'un-bundle
dansLDFLAGS
:Pour linux, vous avez besoin d'un équivalent indépendant de la position d'appel, par exemple,
fPIC
et peut-être-shared
mais je n'ai pas un système linux avec un matlab licence, donc je ne peux pas vérifier:Exécuter le
h5_crtfile
mex fichier. Cela fonctionne sans problèmes sur ma machine. Il n'a tout simplement un H5Fcreate et H5Fclose pour créer de fichier".h5" dans le répertoire courant, et quand je l'appellefile file.h5
- je obtenirfile.h5: Hierarchical Data Format (version 5) data
.Noter que, si je comprend un
-lhdf5
ci-dessus à l'étape 3, puis matlab abandonne lorsque j'essaie d'exécuter le fichier exécutable (car il utilise ensuite matlab bibliothèques dynamiques qui sont pour moi la version 1.6.5), donc ce n'est certainement résoudre le problème sur mon système.Merci pour la question. Ma solution ci-dessus est certainement beaucoup plus facile pour moi que ce que je faisais avant. Nous espérons que les travaux ci-dessus pour vous.
Je suis accepter Ramashalanka de la réponse, car elle m'a conduit à la solution exacte que je poste ici, pour l'exhaustivité:
/usr/include
.)-ldfh5
drapeau dansLDFLAGS
.la commande que j'ai utilisé est, en substance:
cela se traduit par mex dans les commandes:
cette solution devrait fonctionner sur tous mes différentes machines cible et au moins jusqu'à ce que j'ai mise à niveau de matlab r2009a, qui, je crois, utilise hdf5-1.8. merci pour toute l'aide, désolé d'être si dense avec cela-je pense que j'étais trop engagé à l'aide de la version de paquet de hdf5, plutôt que d'une série de fichiers d'en-tête.
Remarque ce serait tous ont été trivial si Mathworks a fourni un ensemble de fichiers d'en-tête avec le Matlab distribution...