ld - relocation error : referenced symbol not found - C++ - Programmation
Marsh Posté le 21-07-2008 à 10:21:44
up
Marsh Posté le 21-07-2008 à 11:28:35
J'ai vu que mon post a été déplacé dans la catégorie python, pas de souci.
Je veux juste souligner que bien que je parle de wrapping python les développeurs C peuvent surement m'aider car avec le code C généré par swig je crée une lib dynamique avec mon compilateur C, et le import depuis python révèle juste un problème avec le ld, j'ai donc mal fait mon link après la compilation.
Marsh Posté le 21-07-2008 à 11:30:08
problème de version d'ABI.
Fait un nm /path/to/lib et grep dedans ton symbole manquant.
Après avec nm -C tu peux le dé-mangler pour savoir à quoi ça correspond comme fonction.
Est-ce que cette lib elle est à toi, genre style c'est toi qui l'a compilé ?
Marsh Posté le 21-07-2008 à 11:39:26
J'y connais rien en Python, mais si y'a du C++ derrière, je te conseillerais de regarder les includes dans les fichiers sources.
Genre #include <string>, #include <iostream>...
Si tu trouves du #include "string.h" par exemple, essaye de le remplacer par un <string>
Après là comme ça, je peux pas vraiment t'aider, en voyant __1cDstdNbasic_istream4Ccn0ALchar_traits4Cc___Funget6M_r1_, on a l'impression qu'il manque la librairie istream, qui devrait être linkée automatiquement quand tu fais un #include <istream> (ou iostream) dans ton code...
Marsh Posté le 21-07-2008 à 11:40:01
c'est un peu comme si je faisais une prière et que Dieu mettait un dans ma prière
D'ailleurs avant de me coucher hier j'ai pensé à demangle, un MP de Dieu probablement.
Je sais que c'est du C++, mais ça faisait deux caractère à écrire en plus
Comment tu sais que c'est un problème d'ABI? Est-ce que ça veut dire qu'une lib va chercher du 32bits au lieu de 64?
Est-ce que choisir Abby c'est un hasard?
Marsh Posté le 21-07-2008 à 11:40:36
Oops, j'ai lu en diagonale.
Je remets dans C++.
Marsh Posté le 21-07-2008 à 11:43:27
FrigoAcide a écrit : J'y connais rien en Python, mais si y'a du C++ derrière, je te conseillerais de regarder les includes dans les fichiers sources. |
Ca compile sans problème, je cherche effectivement la lib qui contient mon symbole not found
Marsh Posté le 21-07-2008 à 11:45:13
Taz a écrit : problème de version d'ABI. |
c'est bien moi qui l'ai compilée au fait.
Marsh Posté le 21-07-2008 à 11:54:25
le -C marche pas, ni --demangle, j'échoue
nm -C /home/st14972/dev/dev_SunOS5.8_64/lib/_pyQVUI.so | grep unget
U __1cDstdNbasic_istream4Ccn0ALchar_traits4Cc___Funget6M_r1_
Marsh Posté le 21-07-2008 à 11:58:06
T'es sous Sun, c'est ça ?
Regarde si t'as pas un nm sous /usr/xpg4/bin ou /usr/ccs/bin, c'est pas le même que par défaut et il prend l'option -C celui-là.
Marsh Posté le 21-07-2008 à 12:04:13
Elmoricq a écrit : T'es sous Sun, c'est ça ? |
Merci,
/usr/ccs/bin/nm -C /home/st14972/dev/dev_SunOS5.8_64/lib/_pyQVUI.so | grep unget
[11104] | 0| 0|FUNC |GLOB |0 |UNDEF |std::basic_istream<char,std::char_traits<char> >&std::basic_istream<char,std::char_traits<char> >::unget()
[__1cDstdNbasic_istream4Ccn0ALchar_traits4Cc___Funget6M_r1_]
effectivement mon PATH est pollué par un pack gcc qui amène des lib et des outils à la con. Mais je crois qu'il est nécessaire pour l'utilisation du python que je dois utiliser. Je vais essayer de le virer de mon environnent.
Marsh Posté le 21-07-2008 à 14:28:52
je capte pas d'où vient cette méthode unget(), si seulement j'arrivais à trouver où je l'appelle...
Marsh Posté le 21-07-2008 à 22:05:01
elle sort probablement d'une méthode template ou inlinée si ça vient pas de toi.
Marsh Posté le 21-07-2008 à 22:14:52
elle est pas dans ma version linux ça aussi je capte pas
Sinon elle est defined dans le nm du binaire de mon appli :
python : import _pyQVUI
_pyQVUI.so (interface de wrapping avec l'appli) -> unget Undefined
appli -> unget Defined
Le symbole devrait pas être résolu à l'import?
Marsh Posté le 21-07-2008 à 22:30:04
bah si c'est ce qui se passe, sauf que ça trouve pas. A part comparer les lib utilisées, je vois pas trop. Dans ton appli, le symbole est à résoudre ou bien il est défini ?
acc c'est bien, mais est-ce que ça a la même ABI que gcc ? (vu que tu pull libgcc)
Marsh Posté le 21-07-2008 à 22:43:54
dans l'appli il est à résoudre, même il est pas pas utilisé, j'ai fait des grep unget partout et je trouve rien, j'ai même pas de ifstream...
je sais pas comment on vérifie le type? version? d'ABI, je sais juste que la variable d'environnement ABI=64 quand on st en 64 bits et pas définie quand on est en 32.
Marsh Posté le 22-07-2008 à 00:18:41
Très fatigué, mais en passant et en lecture diagonale, si je dis pas trop de conneries:
kaloskagatos a écrit : dans l'appli il est à résoudre, même il est pas pas utilisé, j'ai fait des grep unget partout et je trouve rien, j'ai même pas de ifstream... |
Ca fait quelque temps que j'ai pas joué à faire des libs python, mais est-ce qu'il ne chercherait à résoudre certains symboles, même s'ils ne sont jamais appelés, lors de l'import?
kaloskagatos a écrit :
|
Est-ce que tu peux donner les headers de ta lib et de ton appli? Genre objdump -p?
Spoiler : Au fait, avec /home/$USER dans ce genre, tu travaillerais pas dans le coin de St Martin? |
Marsh Posté le 22-07-2008 à 00:28:15
Je te donne ça demain, quand je pourrai passer le firewall de Saint-Martin
Marsh Posté le 22-07-2008 à 09:00:10
t'as un gnuld ou pas ? (--as-needed)
si tu rajoutes un main à ton wrapper, il s'exécute ok ?
( http://udrepper.livejournal.com/8790.html article sympa sur comment faire des bonnes tartes)
Marsh Posté le 22-07-2008 à 10:47:44
kaloskagatos a écrit : dans l'appli il est à résoudre, même il est pas pas utilisé, j'ai fait des grep unget partout et je trouve rien, j'ai même pas de ifstream... |
un peu endormi hier soir, dans l'appli le symbole est défini, mais pas dans le wrapper
Marsh Posté le 22-07-2008 à 14:57:15
si dans l'appli t'arrives à localiser dans quelle unité de compilation il est défini, ça pourrait te tuyauter un peu, non ?
tu fais des nm sur .o et tu cherches
Marsh Posté le 22-07-2008 à 18:38:24
j'ai trouvé qu'en fait c'est une fucking lib à laquelle je me link statiquement mais avec un -lfukinglib donc je croyais que j'avais que des lib dynamiques. Le problème serait donc que cette lib a été compilée avec un compilo différent du mien et que cette méthode unget est obsolète par exemple?
Marsh Posté le 22-07-2008 à 19:03:39
question bête: y'a pas moyen de demander à python de pas chercher à résoudre tous les symboles à l'import de mon module wrappé?
Marsh Posté le 18-07-2008 à 12:06:48
Je suis une quiche en édition des liens, j'aurais besoin de votre aide...
J'ai une appli graphique qui fonctionne bien. Certaines fonctions sont wrappées en python pour pouvoir piloter l'appli depuis un script python. Lors de l'exécution depuis python j'ai un message d'erreur, patapay c'est sous Sun:
pyQVUI est mon interface avec mon appli.
>>>>python screenSave.py
Traceback (most recent call last):
File "screenSave.py", line 10, in ?
from pyQVUI import *
File "/home/st14972/dev/dev_SunOS5.8_64/lib/python/pyQVUI.py", line 5, in ?
import _pyQVUI
ImportError: ld.so.1: python: fatal: relocation error: file /home/st14972/dev/dev_SunOS5.8_64/lib/_pyQVUI.so: symbol __1cDstdNbasic_istream4Ccn0ALchar_traits4Cc___Funget6M_r1_: referenced symbol not found
ldd de _pyQVUI.so :
libQUICKVIEW.so => /home/st14972/dev/./dev_SunOS5.8_64/lib/libQUICKVIEW.so
libVRML.so => /home/st14972/dev/./dev_SunOS5.8_64/lib/libVRML.so
libFX.so => /home/st14972/dev/./dev_SunOS5.8_64/lib/libFX.so
libSTREAMS.so => /home/st14972/dev/./dev_SunOS5.8_64/lib/libSTREAMS.so
libSMAUG.so => /home/st14972/dev/./dev_SunOS5.8_64/lib/libSMAUG.so
libREADER.so => /home/st14972/dev/./dev_SunOS5.8_64/lib/libREADER.so
libNS.so => /home/st14972/dev/./dev_SunOS5.8_64/lib/libNS.so
libUIL.so => /home/st14972/dev/./dev_SunOS5.8_64/lib/libUIL.so
libGL.so.1 => /usr/lib/sparcv9/libGL.so.1
libGLU.so.1 => /usr/lib/sparcv9/libGLU.so.1
libGLw.so.1 => /usr/lib/sparcv9/libGLw.so.1
libdl.so.1 => /usr/lib/sparcv9/libdl.so.1
libX11.so.4 => /usr/lib/sparcv9/libX11.so.4
libXm.so.4 => /usr/lib/sparcv9/libXm.so.4
libXt.so.4 => /usr/lib/sparcv9/libXt.so.4
libXext.so.0 => /usr/lib/sparcv9/libXext.so.0
libXmu.so.4 => /usr/lib/sparcv9/libXmu.so.4
libMrm.so.4 => /usr/lib/sparcv9/libMrm.so.4
libpython2.4.so.1.0 => /home/egat/tools/pythonpack.2.3/local.SunOS.Generic_117350-08_64/lib/libpython2.4.so.1.0
libtcl.so => /home/egat/tools/pythonpack.2.3/local.SunOS.Generic_117350-08_64/lib/libtcl.so
libtk8.4.so => /home/egat/tools/pythonpack.2.3/local.SunOS.Generic_117350-08_64/lib/libtk8.4.so
libresolv.so.2 => /usr/lib/sparcv9/libresolv.so.2
libCVU.so => /vobs/aer/quickview/dev/dev_SunOS5.8_64/data/sftvqvui/qvfile/SLIB//libCVU.so
libqual.so => /home/st14972/dev/./dev_SunOS5.8_64/lib/libqual.so
libfutil.so => /home/st14972/dev/./dev_SunOS5.8_64/lib/libfutil.so
libmoda.so => /home/st14972/dev/./dev_SunOS5.8_64/lib/libmoda.so
libdrago.so => /home/st14972/dev/./dev_SunOS5.8_64/lib/libdrago.so
libdamas.so => /home/st14972/dev/./dev_SunOS5.8_64/lib/libdamas.so
liberrare.so => /home/st14972/dev/./dev_SunOS5.8_64/lib/liberrare.so
libsda.so => /home/st14972/dev/./dev_SunOS5.8_64/lib/libsda.so
libmutil.so => /home/st14972/dev/./dev_SunOS5.8_64/lib/libmutil.so
libm.so.1 => /usr/lib/sparcv9/libm.so.1
libF77.so.4 => /opt/SUNWspro/lib/v9/libF77.so.4
libsunmath.so.1 => /opt/SUNWspro/lib/v9/libsunmath.so.1
libM77.so.2 => /opt/SUNWspro/lib/v9/libM77.so.2
libfsu.so.1 => /opt/SUNWspro/lib/v9/libfsu.so.1
libl.so.1 => /usr/lib/sparcv9/libl.so.1
libpthread.so.1 => /usr/lib/sparcv9/libpthread.so.1
libxnet.so => /usr/lib/sparcv9/libxnet.so
libnsl.so.1 => /usr/lib/sparcv9/libnsl.so.1
libsocket.so.1 => /usr/lib/sparcv9/libsocket.so.1
libCrun.so.1 => /usr/lib/sparcv9/libCrun.so.1
libdga.so.1 => /usr/openwin/lib/sparcv9/libdga.so.1
libc.so.1 => /usr/lib/64/libc.so.1
libintl.so.1 => /usr/lib/64/libintl.so.1
libSM.so.6 => /usr/openwin/lib/sparcv9/libSM.so.6
libICE.so.6 => /usr/openwin/lib/sparcv9/libICE.so.6
librt.so.1 => /usr/lib/64/librt.so.1
libgcc_s.so.1 => /home/egat/tools/gccpack.1.1/local.SunOS.Generic_117350-08/lib/sparcv9/libgcc_s.so.1
libmp.so.2 => /usr/lib/64/libmp.so.2
libaio.so.1 => /usr/lib/64/libaio.so.1
libthread.so.1 => /usr/lib/64/libthread.so.1
/usr/platform/SUNW,Sun-Blade-1000/lib/sparcv9/libc_psr.so.1
Où est-ce que je peux trouver le symbole manquant (__1cDstdNbasic_istream4Ccn0ALchar_traits4Cc___Funget6M_r1_)?
J'utilise aCC pour compiler. (patapay)
Message édité par Elmoricq le 21-07-2008 à 10:32:37
---------------
« Le hasard, c’est différent de la chance. Parce que la chance, je n'en ai jamais. »