Seite 1 von 1

[VCpp] Unreferenced Entry Point = Unresolved External Symbol

Verfasst: 11.06.2010, 00:03
von Krishty
Hi,

Könnt ihr mir erklären, was hier vor sich geht? Also:

Ich habe eine Funktion in einer statisch gelinkten Bibliothek. Diese Funktion soll als Einstiegspunkt einer Anwendung dienen. Der Anwendung ist die Deklaration dieser Funktion bekannt.
Kompiliere ich, erhalte ich LINK : error LNK2001: unresolved external symbol _(Name des Einstiegspunkts). Der Linker scheint den Einstiegspunkt nur im Code der Anwendung, nicht in gelinkten statischen Bibliotheken zu suchen. Dachte ich. Rufe ich nämlich irgendwo in der Anwendung die Funktion, die als Einstiegspunkt vorgegeben ist, auf, kompiliert alles ohne Mucken und der Einstiegspunkt wird gesetzt. Ein Aufruf genügt, eine andere Referenzierung (Adresse nehmen) hingegen nicht – wieder LNK2001. Wt…?!?

Gruß, Ky

Re: [VCpp] Unreferenced Entry Point = Unresolved External Sy

Verfasst: 11.06.2010, 11:56
von Jörg
Was passiert denn, wenn du dem Linker den Standard-Einstiegspunkt angibst? Der liegt ja auch in einer lib....vielleicht ein Bezeichner-Problem (Unterstriche, etc. ? )

Re: [VCpp] Unreferenced Entry Point = Unresolved External Sy

Verfasst: 11.06.2010, 14:14
von Krishty
Gleiches Problem …

Ein Namensproblem habe ich schon die ganze Zeit vor Augen, weil der Linker dem Namen einen Unterstrich voransetzt, wenn er ihn nicht findet. Muss ich den Einstiegspunkt vielleicht als extern "C" deklarieren?

Edit: Nein, extern "C" bringt auch nichts.

Re: [VCpp] Unreferenced Entry Point = Unresolved External Sy

Verfasst: 11.06.2010, 14:41
von kimmi
Schon mal die Calling-Convention geprüft? Und wie sieht das Symbol in der Lib aus ( dumpbin.exe gibt da Auskunft )?

Gruß Kimmi

Re: [VCpp] Unreferenced Entry Point = Unresolved External Sy

Verfasst: 11.06.2010, 14:56
von Krishty
Calling-Convention ist __stdcall, wie es die MSDN vorschreibt.

Dumpbin schreibt 1B1 00000BE0 SECT7C notype () External | ?CricCRTMain@@YGXXZ (void __stdcall CricCRTMain(void)), was mir jetzt nichts sagt. Der Linker-Parameter lautet /ENTRY:CricCRTMain.

Re: [VCpp] Unreferenced Entry Point = Unresolved External Sy

Verfasst: 11.06.2010, 15:49
von Krishty
Okay, funktioniert jetzt. Zuerst einmal habe ich den Einstiegspunkt in extern "C" gepackt, damit die Dekoration kürzer wird (_CricCRTMain@0 statt ?CricCRTMain@@YGXXZ). Dann habe ich den Underscore entfernt und das als Parameter übergeben – /ENTRY:CricCRTMain@0.

Bleibt die Frage, warum er den Einstiegspunkt auch ohne dieses Geraffel gefunden hat, wenn er von der Anwendung aus aufgerufen wurde?

Re: [VCpp] Unreferenced Entry Point = Unresolved External Sy

Verfasst: 12.06.2010, 10:38
von CodingCat
Vielleicht, weil die Funktion ohne expliziten Aufruf fälschlicherweise vom Linker als ungenutzt erkannt wird, und entsprechend bei der Optimierung einfach rausfliegt?

Re: [VCpp] Unreferenced Entry Point = Unresolved External Sy

Verfasst: 12.06.2010, 14:26
von Krishty
Ist ein Debug-Build, da sollte nichts COMDAT-mäßiges gemacht werden.

Auch ist die Funktion unter x64-Builds undekoriert, ich brauche dafür also dann die einfache Variante. Irgendwas stimmt da nicht.

Re: [VCpp] Unreferenced Entry Point = Unresolved External Sy

Verfasst: 13.06.2010, 11:24
von Helmut
In x64 gibt es nur noch eine Callingconvention, also auch keine Dekorationen mehr. Zumindest für C Funktionen.

Wenn man in x86 eine Funktion mit dem reinen Namen ohne Schnickschnack exportieren möchte, muss sie mit __cdecl deklariert sein. Wie das die ganzen Win32 Dlls trotzdem mit __stdcall und ohne Dekoration exportieren wüsste ich auch mal gerne...

Ciao