Question

En C ++, la bibliothèque statique A est liée aux bibliothèques dynamiques B et C. Si une classe, Foo, est utilisée dans A qui est défini dans B, C sera-t-il lié s'il n'utilise pas Foo?

Je pensais que la réponse était oui, mais je rencontre maintenant un problème avec xlc_r7 où la bibliothèque C dit que Foo est un symbole non défini, ce qui en ce qui concerne C est concerné. Mon problème avec cela est que la bibliothèque C n'utilise pas la classe qui la référence. Ce lien dans Win32 (VC6) et OpenVMS.

S'agit-il d'une différence d'éditeur de liens ou d'un PBCAK?

Nouvelle information:

  1. B dépend de C mais pas l'inverse.

  2. Je n'utilise pas / OPT: REF pour créer un lien sous Windows et ce, sans problème.

Était-ce utile?

La solution

Lorsque vous établissez une liaison statique, deux modules ne font plus qu’un. Ainsi, lorsque vous compilez C et y associez A, c'est comme si vous aviez copié tout le code source de A dans le code source de C, puis compilé le code source combiné. Donc, C.dll inclut A, qui dépend de B via Foo. Vous aurez besoin de lier la bibliothèque de liens de C à B pour satisfaire cette dépendance.

Notez que selon vos informations, cela créera une dépendance circulaire entre B et C.

Autres conseils

On dirait que c'est probablement l'éditeur de liens (ld / unix), car (la plupart des versions que j'ai utilisées de) ld relie les bibliothèques de gauche à droite - et s'il existe une référence dans la première qui est requise par L’astuce habituelle consiste à ajouter la première bibliothèque (ou toute bibliothèque requise) à la fin de la commande.

C'est à essayer et à voir ....

Votre ligne de lien pour C inclut-elle la bibliothèque d’exportation pour B? Si c'est le cas, comme Richard le suggère, cela ressemble à une chose d'ordre.

Une autre suggestion est de voir s'il existe une option d'éditeur de liens pour ignorer les symboles non référencés, si C n'a pas besoin de cette fonctionnalité de A. Pour l'éditeur de liens Microsoft, cela est réalisé avec le commutateur / OPT: REF.

La seule raison pour laquelle C ne souhaite pas créer de lien est que le compilateur pense qu'il n'a pas besoin du symbole Foo.

Puisque C ne fait pas référence aux symboles Foo, il doit y avoir une autre raison pour laquelle l'éditeur de liens a besoin du symbole.

La seule autre raison à ma connaissance est une sorte d’exportation. Je ne connais que Visual C ++, je vous suggère donc de rechercher un équivalent de __ declspec (dllexport) dans les fichiers prétraités et de voir ce qui le génère.

Voici ce que je ferais: stocker la sortie du préprocesseur dans un fichier séparé et rechercher les occurrences de Foo. Soit il s’agit d’une exportation, soit il a été référencé d’une manière ou d’une autre par le compilateur.

Si la définition d'une fonction particulière n'est pas requise, cette bibliothèque ne sera pas liée pendant la phase de liaison. Dans votre cas, comme la définition de foo est présente dans la bibliothèque B et non dans la bibliothèque C. Ainsi, la bibliothèque C ne sera pas chargée dans la mémoire lors du chargement de l’exécutable.

Mais il semble que vous utilisiez également la fonction foo () dans la bibliothèque C, à cause de laquelle vous obtenez l'erreur correspondante.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top