Wie werden Konflikte mit Linker-Abhängigkeiten gelöst?

8

Wenn ich zwei Bibliotheken habe, A.lib und B.lib , die beide foo und bar exportieren, wie sage ich dem Linker, das Symbol% ​​co_de% von foo und das Symbol% ​​zu verwenden co_de% von A.lib ?

    
Mehrdad 23.01.2012, 01:30
quelle

3 Antworten

3

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).

    
sholsapp 23.01.2012, 08:26
quelle
3

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:

  • Verwenden Sie zuerst /REMOVE auf A.LIB , um bar.obj zu entfernen:
    LIB.EXE /OUT:ANOBAR.LIB /REMOVE:bar.obj A.LIB
  • Kombinieren Sie dann 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.

    
Johan Bezem 23.01.2012 09:26
quelle
1

Wenn Sie dynamische Bibliotheken verwenden, können Sie dynamisches Laden verwenden und foo von A und bar auswählen. von B beim Laden.

    
Niklas Hansson 23.01.2012 07:20
quelle

Tags und Links