Python ImportError - symbole non défini - pour le module C ++ personnalisé
J'ai développé un module Python en C++ à l'aide d'OpenCV 2.3 dans 2.4.2, sur Ubuntu 11.04. OpenCV a été construit à partir de la source. Je ne suis pas en utilisant la version d'OpenCV depuis les dépôts Ubuntu.
Mon module Python compile sans problèmes et est chargé en Python correctement. Cependant, quand je compile ce module sur Ubuntu 11.10 ou 12.04, j'ai un ImportError avec le message "undefined symbol" lorsque vous essayez de charger en Python.
C'est de cette façon que je compile le module:
g++ -fPIC -shared `pkg-config --cflags --libs python` `pkg-config --cflags --libs opencv` -I/usr/local/include/opencv2/legacy -o mymodule.so mymodule.cpp
C'est la sortie de "pkg-config --cflags --libs opencv"
-I/usr/local/include/opencv -I/usr/local/include /usr/local/lib/libopencv_calib3d.so /usr/local/lib/libopencv_contrib.so /usr/local/lib/libopencv_core.so /usr/local/lib/libopencv_features2d.so /usr/local/lib/libopencv_flann.so /usr/local/lib/libopencv_gpu.so /usr/local/lib/libopencv_highgui.so /usr/local/lib/libopencv_imgproc.so /usr/local/lib/libopencv_legacy.so /usr/local/lib/libopencv_ml.so /usr/local/lib/libopencv_nonfree.so /usr/local/lib/libopencv_objdetect.so /usr/local/lib/libopencv_photo.so /usr/local/lib/libopencv_stitching.so /usr/local/lib/libopencv_ts.so /usr/local/lib/libopencv_video.so /usr/local/lib/libopencv_videostab.so
L'erreur que j'obtiens est:
ImportError: /path/to/service/mymodule.so: undefined symbol: _ZN5CvSVMD1Ev
Ma compréhension est que "undefined symbol" signifie généralement que le symbole ne peut pas être trouvée dans l'une des librairies. Mais je sais que ce symbole est là, dans libopencv_ml.donc, parce que quand je lance ceci:
$ nm -g /usr/local/lib/libopencv_ml.so | grep _ZN5CvSVMD1Ev
J'obtiens:
000000000002fd40 T _ZN5CvSVMD1Ev
/usr/local/lib semble être dans l'éditeur de liens dynamique du cache.
$ cat /etc/ld.so.conf.d/libc.conf
# libc default configuration
/usr/local/lib
Et le fichier est présent dans le cache.
$ ldconfig -p | grep opencv | grep ml
libopencv_ml.so.2.4 (libc6,x86-64) => /usr/local/lib/libopencv_ml.so.2.4
libopencv_ml.so (libc6,x86-64) => /usr/local/lib/libopencv_ml.so
Alors pouvez-vous me donner aucune idée de ce que je fais de mal? A quelque chose a changé entre Ubuntu 11.04 et 11.10, dans la manière dont les bibliothèques partagées sont chargés lors de l'exécution de Python? Ou est-ce un problème avec OpenCV?
source d'informationauteur Rajesh J Advani | 2012-07-25
Vous devez vous connecter pour publier un commentaire.
La solution est de mettre le module généré nom avant les autres modules dont il dépend, sur le g++ de ligne de commande.
La page de man de gcc dit de l'option "-l",
Depuis le nom de mymodule.si auparavant les bibliothèques, il était censé être lié à aucun d'entre eux étaient liés à l'généré .donc fichier.
Merci pour @J. F. Sebastian pour mettre en évidence comment -l fonctionne.