[VCpp] Unreferenced Entry Point = Unresolved External Symbol

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8245
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

[VCpp] Unreferenced Entry Point = Unresolved External Symbol

Beitrag 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
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

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

Beitrag 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. ? )
Benutzeravatar
Krishty
Establishment
Beiträge: 8245
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

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

Beitrag 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
Benutzeravatar
Krishty
Establishment
Beiträge: 8245
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8245
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

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

Beitrag von CodingCat »

Vielleicht, weil die Funktion ohne expliziten Aufruf fälschlicherweise vom Linker als ungenutzt erkannt wird, und entsprechend bei der Optimierung einfach rausfliegt?
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Krishty
Establishment
Beiträge: 8245
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Helmut
Establishment
Beiträge: 237
Registriert: 11.07.2002, 15:49
Wohnort: Bonn
Kontaktdaten:

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

Beitrag 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
Antworten