Sie können nicht. In Ihrem Beispiel können Sie Definitionen aus foo.lib
oder bar.lib
haben, aber nicht aus beiden (besonders wenn Sie die Bibliotheken nicht neu kompilieren und die Symbolsichtbarkeit so einstellen können, dass nur die gewünschten Symbole exportiert werden). Die Reihenfolge, in der Sie sie mit Ihrer Anwendung verknüpfen, hängt davon ab, welche Bibliotheksdefinitionen verwendet werden (Sie müssen die wissenschaftliche Methode verwenden, ich denke, die erste verknüpfte gewinnt). Niklas Hanssons Antwort ist eine großartige Möglichkeit, dies dynamisch zu tun, aber es scheint, dass Sie die ursprüngliche Anwendung auch nicht ändern möchten, um dynamisch auszuwählen, welche Symbole aus den Bibliotheken entnommen werden sollen.
Wenn Sie wirklich wollten, könnten Sie die Symboltabellen mit einem Hexeditor manipulieren, damit die Symbole, die Sie nicht exportieren möchten, unterschiedliche Namen haben (hacky, aber es würde funktionieren). Ich weiß unter Linux, dass es ein Tool namens objcopy
gibt, mit dem Sie das machen können (ich bin mir nicht sicher, ob es Windows gibt).
Sie können LIB.EXE /EXTRACT ...
verwenden, um nur die Objektdateien zu extrahieren, die Sie verwenden möchten, und diese Dateien in Ihre eigene Anwendung einbinden.
Oder Sie können LIB
verwenden, um eine neue Bibliothek mit den benötigten Elementen zu erstellen:
/REMOVE
auf A.LIB
, um bar.obj
zu entfernen: LIB.EXE /OUT:ANOBAR.LIB /REMOVE:bar.obj A.LIB
A.LIB
und B.LIB
und stellen Sie sicher, dass ANOBAR.LIB
als letztes in der Befehlszeile verwendet wird, um sicherzustellen, dass foo.obj
anstelle von B.LIB
verwendet wird: LIB.EXE /OUT:COMBINED.LIB B.LIB ANOBAR.LIB
Details finden Sie hier: Verwalten einer Bibliothek , insbesondere der Absatz:
Sie können LIB verwenden [...] Um ein Bibliothekselement durch ein neues Objekt zu ersetzen, geben Sie die Bibliothek an, die das zu ersetzende Elementobjekt und den Dateinamen für das neue Objekt (oder die Bibliothek, in der es enthalten ist) enthält. Wenn ein Objekt mit demselben Namen in mehr als einer Eingabedatei vorhanden ist, fügt LIB das letzte im LIB-Befehl angegebene Objekt in die Ausgabebibliothek ein. Wenn Sie ein Bibliothekselement ersetzen, müssen Sie das neue Objekt oder die neue Bibliothek nach der Bibliothek angeben, die das alte Objekt enthält.
Ich habe die angegebenen Befehlszeilen nicht getestet, aber ich habe in der Vergangenheit häufig ähnliche verwendet.
Wenn Sie dynamische Bibliotheken verwenden, können Sie dynamisches Laden verwenden und foo
von A und bar
auswählen. von B beim Laden.
Tags und Links c visual-c++ linker dllexport