8 votes

Comment résoudre les conflits de dépendances de linker ?

Si j'ai deux bibliothèques, A.lib y B.lib qui exportent tous deux foo y bar comment puis-je dire à l'éditeur de liens d'utiliser le symbole foo de A.lib et le symbole bar de B.lib ?

3voto

sholsapp Points 2915

Vous ne pouvez pas. Pour votre exemple, vous pouvez avoir des définitions de foo.lib o bar.lib mais pas les deux (surtout si vous ne pouvez pas recompiler les bibliothèques et définir la visibilité des symboles pour que seuls les symboles que vous voulez soient exportés). L'ordre dans lequel vous les liez à votre application dépendra des définitions de la bibliothèque utilisée (vous devrez utiliser la méthode scientifique, je pense que la première liée l'emporte). La réponse de Niklas Hansson est un excellent moyen de faire cela dynamiquement, mais il semble que vous ne vouliez pas non plus modifier l'application originale pour choisir dynamiquement les symboles à extraire des bibliothèques.

Si vous le vouliez vraiment, vous pourriez manipuler les tables de symboles avec un éditeur hexadécimal de sorte que les symboles que vous Ne le fais pas. veulent exporter ont des noms différents (hacky, mais ça marcherait). Je sais que sous Linux, il existe un outil appelé objcopy qui vous permettrait de le faire (je ne suis pas sûr pour Windows).

3voto

Johan Bezem Points 1547

Vous pouvez utiliser LIB.EXE /EXTRACT ... pour n'extraire que les fichiers d'objets que vous voulez utiliser, et lier ces fichiers à votre propre application.

Ou vous pouvez utiliser LIB pour créer une nouvelle bibliothèque contenant les éléments dont vous avez besoin :

  • D'abord, utilisez /REMOVE en A.LIB de supprimer bar.obj :
    LIB.EXE /OUT:ANOBAR.LIB /REMOVE:bar.obj A.LIB
  • Ensuite, combinez A.LIB y B.LIB et assurez-vous d'utiliser ANOBAR.LIB comme le dernier sur la ligne de commande pour s'assurer que son foo.obj est utilisé à la place de B.LIB 's :
    LIB.EXE /OUT:COMBINED.LIB B.LIB ANOBAR.LIB

Les détails se trouvent ici : Gérer une bibliothèque surtout le paragraphe :

Vous pouvez utiliser LIB [...] Pour remplacer un membre de bibliothèque par un nouvel objet, spécifiez la bibliothèque contenant l'objet membre à remplacer et le nom de fichier du nouvel objet (ou de la bibliothèque qui le contient). Lorsqu'un objet portant le même nom existe dans plus d'un fichier d'entrée, LIB place le dernier objet spécifié dans la commande LIB dans la bibliothèque de sortie. Lorsque vous remplacez un membre de bibliothèque, veillez à spécifier le nouvel objet ou la nouvelle bibliothèque après la bibliothèque qui contient l'ancien objet.

Je n'ai pas testé les lignes de commande données, mais j'ai utilisé des lignes similaires de manière intensive dans le passé.

1voto

Niklas Hansson Points 505

Si vous utilisez des bibliothèques dynamiques, vous pourriez utiliser chargement dynamique et choisir foo de A et bar de B lors du chargement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X