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_PATHqui 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.soetc.

Je pense que le crt_file.c exemple fonctionne soit en b/c il n'utilise pas les fonctions, je suis en utilisant (H5DOpenqui 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