2016-08-02 2 views
1

Ich versuche, Montage (kompiliert mit yasm) mit Objekten von msvc/cl.exe zusammengestellt zu kombinieren, die ich (mit link.exe) in eine .dll zu verbinden bin versucht, das ist dann mit der endgültigen ausführbaren Datei verknüpft.Ungelöste Referenz bei der Verknüpfung kompilierten Code mit NASM und MSVC

Sowohl das Erstellen der Objektdateien aus der Quelle und das Erstellen der DLL aus diesen Objekten funktioniert absolut gut.

Im letzten Schritt, die .dll mit der ausführbaren Datei verknüpft sind folgende Fehler ausspuckt:

error LNK2019: unresolved external symbol xxx_xxxx 

Ich verwende C. Trotz Win64 keinen Namen Mangeln hat, habe ich versucht, mehrere Systeme (wie _xxx_xxxx oder __imp_xxx_xxxx) .

Untersuchung der Objektdatei mit dumpbin.exe zeigt alle Symbole:

$ dumpbin /symbols myobj.o 
File Type: COFF OBJECT 

COFF SYMBOL TABLE 
000 00000000 DEBUG notype  Filename  | .file 

002 00000000 SECT1 notype  Static  | .text 
Section length 215, #relocs 0, #linenums 0, checksum  0 
004 00000057 SECT1 notype  External  | xxx_xxxx 
005 0000013E SECT1 notype  External  | xxx_xxxx 
006 00000000 SECT1 notype  External  | xxx_xxxx 

Aber nicht in den exportierten Symbole aus der .dll:

$ dumpbin /exported mylib.dll 
File Type: DLL 

    Section contains the following exports for mylib.dll 

    00000000 characteristics 
    57A0FE02 time date stamp Tue Aug 02 22:09:38 2016 
     0.00 version 
      1 ordinal base 
     132 number of functions 
     132 number of names 

[...] 

Auch wenn ich die Erklärungen innerhalb der .dll als exportiert markiert unter Verwendung von __declspec(dllexport).

Irgendwelche Ideen, wie man den Linker befriedigt und ihm die Symbole sagt, sind tatsächlich dort?

+0

Sie können eine DLL mithilfe der Microsoft-Tools nicht mit einer ausführbaren Datei verknüpfen. Sie müssen eine Importbibliothek verwenden, die der DLL entspricht. –

+0

@RossRidge Ich verwende die generierte Importbibliothek. – Leandros

Antwort

1

Wie Sie sehen, ist das Problem, dass DLL das erforderliche Symbol nicht verfügbar macht. __declspec(dllexport) ist nicht die einzige Möglichkeit, Ihre Symbole zu exportieren. Wenn Sie ein paar exportierte Namen haben, können Sie /EXPORT Linker-Schalter verwenden. Eine weitere Alternative ist die Datei Module-Definition.

+0

Leider mehr als nur ein paar Funktionen, die '/ EXPORT' unmöglich machen. Kann ich eine bereits erstellte .lib kombinieren, um die DLL mit einem anderen create über die def-Datei zu verknüpfen? – Leandros

+0

Ja, DEF-Datei ist nur eine Liste von Funktionen, die Sie exportieren möchten (plus einige zusätzliche Informationen). Die Funktionalität der resultierenden Binärdateien wird nicht beeinflusst. Und natürlich sollten Sie prüfen, ob die Funktionen mit 'dumpbin' an der Export-Tabelle erscheinen. – Sergio

+0

Während das funktioniert, ist es leider nur eine halbe Lösung. Ich kann nicht jedes Symbol manuell zu meinen Build-Flags oder der Def-Datei hinzufügen. – Leandros

Verwandte Themen