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
?
Réponses
Trop de publicités?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).
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
enA.LIB
de supprimerbar.obj
:LIB.EXE /OUT:ANOBAR.LIB /REMOVE:bar.obj A.LIB
- Ensuite, combinez
A.LIB
yB.LIB
et assurez-vous d'utiliserANOBAR.LIB
comme le dernier sur la ligne de commande pour s'assurer que sonfoo.obj
est utilisé à la place deB.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é.
Si vous utilisez des bibliothèques dynamiques, vous pourriez utiliser chargement dynamique et choisir foo
de A et bar
de B lors du chargement.