Problème de «référence indéfinie à la fonction» même après avoir lié la bibliothèque qui a la définition

J’essaie de créer un exécutable avec des fichiers .o, .so, .a.

Voici ma commande de construction: –

pkgs/gcc/v4.8.3/bin/gcc -L/usr/X11R6/lib -O2 -DUSE_FLEX -Wall -Wno-char-subscripts -fPIC -DLINUX -DG_DISABLE_CONST_RETURNS -fno-ssortingct-aliasing -o ../build/kl/Release/test/bin/pure.exe -L../build/kl/Release/test/modules ../build/kl/Release/test/maker/constrfunc.TCL.o ../../build/kl/Release/test/maker/pvdbprocs.TCL.o .. ../build/kl/Release/test/maker/maker/memmaker.TCL.o .. ../build/kl/Release/test/maker/modules/libdenbase.a .. ../build/kl/Release/test/maker/guibase.o -litk3.2 -litcl4.0.0 -ltk8.3 -lcdnviptcl8.4 -litclstub4.0.0 -ldenbase -lglib-2.0 -ldenbase -lX11 -ldl -lm -lviputil -lvippli -lcdsCommonMT_sh -lpthread -L/home/dlb/extlibs/arm/lib 

J’ai des bibliothèques qui ont des définitions des fonctions sur le chemin “-L / home / dlb / extlibs / arm / lib”. Il y a encore une erreur de lancer ci-dessous.

Erreur:

 ../build/kl/Release/test/maker/guibase.o: In function `decodeAddrList': tree234.c:(.text+0xc): undefined reference to `psortingtclStubsPtr' tree234.c:(.text+0x20): undefined reference to `ptrlitclStubsPtr' tree234.c:(.text+0x12c): undefined reference to `ptrlitclStubsPtr' tree234.c:(.text+0x140): undefined reference to `ptrlitclStubsPtr' 

J’ai le symbole dans la bibliothèque qui se trouve dans chemin / home / dlb / extlibs / arm / lib: –

Commander:-

 readelf -s libitcl4.0.0.so | grep ptrlitclStubsPtr 348: 0000000000060f10 8 OBJECT LOCAL DEFAULT 24 ptrlitclStubsPtr 

Est-ce que j’ai râté quelque chose?

Notez que OP a fourni plus d’informations dans un compte-rendu de la même question;
citation d’un commentaire de OP:
“En raison de problèmes de confidentialité … je suis en train de renommer les symboles … Il a été édité par moi … C’était une faute de frappe … je viens de le corriger … :)”
C’est-à-dire que les identifiants dans le message d’erreur et la ligne grep ainsi que la sortie de la ligne grep ont été modifiés manuellement.

Il semble que les fonctions que vous demandez sont locales au fichier où elles ont été définies. C’est-à-dire qu’il semble qu’ils étaient explicitement destinés à ne pas (et même pas autorisés) à être appelés à l’extérieur.

Autrement dit, quelque part dans le code source de la bibliothèque partagée libitcl4.0.0.so figure probablement une déclaration du type:

 static tclStubs *ptrlitclStubsPtr; 

Ce mot clé static indique que la visibilité du symbole résultant ptrlitclStubsPtr est limitée à son propre fichier source.

Je déduis tout cela du fait que votre sortie readelf rapscope inclut la ligne

 348: 0000000000060f10 8 OBJECT LOCAL DEFAULT 24 ptrlitclStubsPtr 

Ce drapeau LOCAL indique que le symbole est local. S’il était global, destiné (et capable) à être appelé de manière externe, le drapeau GLOBAL apparaîtrait à la place.

Pourquoi les variables sont-elles rendues privées ( static ), alors vous ne pouvez pas les utiliser? C’est une affaire d’ingénierie logicielle, “masquage d’informations”, destinée à réduire la “largeur” ​​de l’interface entre vous et une bibliothèque telle que libitcl4 . Les symboles privés sont plus intimement liés aux décisions de mise en œuvre au sein de libitcl4 , décisions qui ne sont pas censées être visibles des appelants ou qui les inquiètent. On pense que si les appelants avaient access à ces symboles, ils devraient également connaître d’autres détails d’implémentation, ce qui signifie que l’auteur de libitcl4 serait alors incapable de modifier ces détails d’implémentation sans casser (invalider) le code appelant. Donc, pour éviter cette situation, le choix est généralement fait pour empêcher l’appelant de devenir dépendant de cette manière.

Dans cette situation, vous avez essentiellement trois voies à suivre:

  1. Supprimez les balises static des déclarations de variable dans les sources de libitcl4.0.0.so . (Cela nécessite évidemment que vous ayez access aux sources de libitcl4.0.0.so et que vous libitcl4.0.0.so le reconstruire. C’est probablement aussi une très mauvaise idée. Comme je l’ai expliqué, ces symboles ont probablement été statiques pour une bonne raison. )

  2. Ajoutez une nouvelle fonction dans libitcl4.0.0.so qui fait tout ce dont vous avez besoin et qui, en raison de son placement dans le même fichier source, a access à ces symboles. (Cela aussi nécessite que vous ayez access à et que vous puissiez reconstruire “ libitcl4.0.0.so`.)

  3. Trouvez un autre moyen de faire tout ce dont vous avez besoin, en utilisant les installations publiques existantes de libitcl4.0.0.so .