Facile de vérifier les symboles non résolus dans les bibliothèques partagées?
Je suis en train d'écrire un assez grand C++ partagée la bibliothèque d'objets, et ont rencontré un petit problème qui rend le débogage d'une douleur:
Si je définis une fonction/méthode dans un fichier d'en-tête, et oublier de créer un stub pour elle (en cours de développement), depuis que je suis bâtiment comme un objet partagé bibliothèque plutôt que d'un exécutable, pas d'erreurs apparaissent au moment de la compilation de me dire que j'ai oublié de la mettre en fonction. La seule façon que je trouve quelque chose est mauvais, c'est au moment de l'exécution, lorsque finalement une demande de liaison à l'encontre de cette bibliothèque tombe sur un "undefined symbol' erreur.
Je suis à la recherche d'un moyen facile de vérifier si j'ai tous les symboles dont j'ai besoin au moment de la compilation, peut-être quelque chose que je peux ajouter à mon Makefile.
Une solution je suis venu avec est de lancer la compilation de la bibliothèque par le biais de nm -C -U
pour obtenir un demangled liste de tous les indéfini références. Ce problème est également livré avec la liste de toutes les références qui sont dans d'autres bibliothèques, comme la GLibC, ce qui bien sûr va être liées avec cette bibliothèque lors de l'application finale est mis en place. Il serait possible d'utiliser la sortie de nm
à grep
à travers tous mes fichiers d'en-tête et de voir si l'un des noms correspondant.. mais cela semble fou. Ce n'est sûrement pas rare de problème et il y a une meilleure façon de le résoudre?
nm -C -u
m'a sauvé plusieurs fois! (note de l'minuscules-u
sur mon système). En laissant ce commentaire ici pour que je puisse trouver la prochaine fois que j'en ai besoin.
Vous devez vous connecter pour publier un commentaire.
Découvrez le linker option
-z defs
/--no-undefined
. Lors de la création d'un objet partagé, il fera le lien à l'échec si il y a des symboles non résolus.Si vous utilisez gcc pour appeler l'éditeur de liens, vous allez utiliser le compilateur
-Wl
option pour passer à l'option de l'éditeur de liens:Considérez, par exemple, le fichier suivant:
Maintenant, si vous créez un objet partagé, il réussira:
Mais si vous ajoutez
-z defs
, le lien va échouer et vous dire au sujet de votre symbole manquant:-Bsymbolic
à l'éditeur de liens de ligne de commande. Même siforgot_to_define
existe maintenant dans la bibliothèque grâce à la-z
vérifier, le fichier exécutable peut toujours la remplacer par sa propre définition et la bibliothèque de définitions ira à remplacer;-Bsymbolic
forces de choses, de sorte que la bibliothèque de définitions de ses fonctions d'aller à ses fonctions.// forgot_to_define(fp);
il n' pas signaler une erreurSur Linux (qui vous semblent utiliser)
ldd -r a.out
devrait vous donner exactement la réponse que vous cherchez.Mise à JOUR: un banal moyen de créer
a.out
contre laquelle vérifier:À propos d'une suite de tests ? Vous créer des maquettes de fichiers exécutables qui relient les symboles dont vous avez besoin. Si la liaison échoue, cela signifie que votre interface de la bibliothèque est incomplète.
J'ai eu le même problème une fois. J'ai été l'élaboration d'un modèle de composant en C++, et, bien sûr, les composants doivent se charger dynamiquement lors de l'exécution. Trois solutions me viennent à l'esprit, c'étaient ceux que j'ai appliqué:
Espère que ça aide.