2012-04-02 7 views
3

Ich weiß, dass dies schon tausend Mal gefragt wurde, aber ich habe mir seit ein paar Tagen meine Nägel anbeißen lassen. Ich bin ziemlich neu in C++ und das ist mein erstes Mal mit Visual Studio.Ungelöster externer Symbolfehler (LNK2019), nach dem Einfügen der Header

Ich versuche den TORCS Racing Simulator für einen Wettbewerb an meiner Universität zu modifizieren. Das meiste ist schon gemacht worden, also ist nur ein Teil von dem, was ich poste, tatsächlich mein Code. Aber ich habe einige neue Funktionen hinzugefügt und ich habe Probleme damit.

Die ganze Sache funktionierte gut in Linux mit g ++, aber wenn ich versuche, es in Visual Studio 2005 zu kompilieren, erhalte ich einen ungelösten externen Symbolfehler.

Ich habe der Lösung ein neues Projekt hinzugefügt, das Funktionen aus anderen Projekten verwendet.

In diesem neuen Projekt nenne ich die Funktion:

getisDerbyDuel() 

, die in raceinit.h deklariert ist, die ich in dem neuen Projekt enthalten.

#ifndef _RACEINIT_H_ 
#define _RACEINIT_H_ 

#define RACE_ENG_CFG "config/raceengine.xml" 

extern void ReInit(void); 
extern void ReShutdown(void); 
extern void ReStartNewRace(void * /* dummy */); 
extern void ReAddRacemanListButton(void *menuHandle); 
extern int ReInitCars(void); 
extern int ReInitTrack(void); 
extern void ReRaceCleanup(void); 
extern void ReRaceCleanDrivers(void); 
extern char *ReGetCurrentRaceName(void); 
extern char *ReGetPrevRaceName(void); 
extern bool getisDerbyDuel(void); 
extern void setisDerbyDuel(bool isDerbyDuel); 

extern tModList *ReRaceModList; 

#endif /* _RACEINIT_H_ */ 

und definiert in raceinit.cpp:

bool _isDerbyDuel = true; 

void setisDerbyDuel(bool isDerbyDuel) { 
    _isDerbyDuel = isDerbyDuel; 
} 
bool getisDerbyDuel(void) { 
    return _isDerbyDuel; 
} 

Die raceinit.h und raceinit.cpp in einer anderen Projekte in meiner Lösung sind Client aufgerufen, die ohne Fehler kompiliert wird. Ich habe auch die client.lib zu den Abhängigkeiten in meinem Projekt hinzugefügt.

Beim Kompilieren erhalte ich folgende Ausgabe:

1>Generating Code... 
1>Compiling resources... 
1>Linking... 
1> Creating library .\Release/championship2010server.lib and object  .\Release/championship2010server.exp 
1>championship2010server.obj : error LNK2019: unresolved external symbol "bool __cdecl  getisDerbyDuel(void)" ([email protected]@YA_NXZ) referenced in function "void  __cdecl drive(int,struct CarElt *,struct Situation *)"  ([email protected]@[email protected]@[email protected]@@Z) 
1>.\Release/championship2010server.dll : fatal error LNK1120: 1 unresolved externals 
1>Build log was saved at "file://c:\Users\Administrator\Desktop\torcs-verylasttry \src\drivers\championship2012server\Release\BuildLog.htm" 
1>championship2010server - 2 error(s), 9 warning(s) 
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========  

Irgendwelche Ideen geschätzt werden, ich weiß nicht mehr, was ich zu versuchen.


EDIT:

Vielen Dank für Ihre Antworten. Ich habe versucht, die externe Sache zu ändern, so dass das Flag selbst in der Header-Datei extern erklärt wird und der Getter nicht (und mehrere Kombinationen), aber nichts scheint die Fehlerausgabe zu ändern.

Ich bin nicht genau sicher, was mit dem Export der Funktionen gemeint ist. Eine schnelle Google-Suche mich zu dieser führen:

[..] 
extern void ReRaceCleanDrivers(void); 
extern char *ReGetCurrentRaceName(void); 
extern char *ReGetPrevRaceName(void); 
#ifdef __cplusplus 
extern "C" { // only need to export C interface if 
       // used by C++ source code 
#endif 
extern bool __declspec(dllimport) getisDerbyDuel(void); 
extern void __declspec(dllimport) setisDerbyDuel(bool isDerbyDuel); 

#ifdef __cplusplus 
} 
#endif 
extern bool _isDerbyDuel; 
[...] 

und

extern "C" { 
#include <raceinit.h> 
} 

, die den Fehler Ausgabe auf diese geändert:

1>championship2010server.obj : error LNK2019: unresolved external symbol  __imp__getisDerbyDuel referenced in function "void __cdecl drive(int,struct CarElt *,struct  Situation *)" ([email protected]@[email protected]@[email protected]@@Z) 
1>.\Release/championship2010server.dll : fatal error LNK1120: 1 unresolved externals 

Ich weiß nur nicht, was ist hier falsch.


EDIT ZWEI:

So, nachdem auf den Import/Export-Funktionen Lesung bis angepasst ich meinen Code.
Die Header-Datei, in der die ungelöste Funktion sieht nun wie folgt erklärt:

#ifdef __cplusplus 
extern "C" { // only need to export C interface if 
       // used by C++ source code 
#endif 
__declspec(dllexport) bool getisDerbyDuel(void); 
__declspec(dllexport) void setisDerbyDuel(bool isDerbyDuel); 

#ifdef __cplusplus 
} 
#endif 
extern bool _isDerbyDuel; 

Die Datei, wo ich die Funktion aufrufen, nicht eine Header-Datei, aber ich versuchte, die importierte Funktion nach der erklären andere Funktionen in der Datei:

[...] 
static tTrack *curTrack; 
static int RESTARTING[NBBOTS]; 

static void initTrack(int index, tTrack* track, void *carHandle, 
     void **carParmHandle, tSituation *s); 
static void newrace(int index, tCarElt* car, tSituation *s); 
extern "C" void drive(int index, tCarElt* car, tSituation *s); 
static void endrace(int index, tCarElt *car, tSituation *s); 
static void shutdown(int index); 
static int InitFuncPt(int index, void *pt); 

__declspec(dllimport) bool getisDerbyDuel(void); 
[...] 

der Header wie jede andere enthalten ist und die Funktion wie folgt aufgerufen:

if (getisDerbyDuel()) { 
[...] 

jetzt Der Fehlerausgang auf diese geändert:

error LNK2019: unresolved external symbol _getisDerbyDuel referenced in function _drive 

mir So scheint es, dass, wenn ich einig C/C++ Kompatibilitätsproblem nur gelöst (oder machte es noch schlimmer, ich bin nicht einmal sicher mehr), aber die Linke Problem bleibt unverändert.

Irgendwelche Ideen? Ich bin jetzt irgendwie aufgeschoben, aber ich muss das zur Arbeit bringen, oder mein Chef wird sauer sein.

+0

Haben Sie Ihre neuen Funktionen exportiert? In Linux werden Funktionen und Klassen standardmäßig exportiert und in Windows nicht. Dies würde erklären, warum der Linker unter Windows und nicht Linux klagt – SirGuy

+0

Es wird gesagt, dass getisDerbyDuel() externe Verknüpfung hat. In C ist die externe Verknüpfung standardmäßig. –

+0

http://stackoverflow.com/questions/496448/how-to-correctly-use-the-extern-keyword-in-c –

Antwort

6

Wie gesagt, ich bin neu in Visual Studio, aber das ist immer noch ein bisschen peinlich. Ich habe meinen Fehler gefunden und er war nicht in meinem Code enthalten.
Zusätzlich zu dem Linker-Eingang usw. musste ich das Projekt, das raceinit.cpp enthielt, zu den Referenzen in meinem neuen Projekt hinzufügen. Das hat mein Problem gelöst.

3

Visual Studio verwendet eine andere Methode für Pfad-Includes und Lib-Linking.

Überprüfen Sie die Projekteinstellungen:

  1. rechts Ihr Projekt klicken und
  2. unter ‚Konfigurationseigenschaften‘ Prüfung unter ‚Einstellungen‘ die Option "C/C++, die Sie haben die Pfade zu den Header hinzugefügt Sie müssen
  3. nun unter ‚Linker‘ überprüfen, dass Sie den Pfad zu Ihrem lib-Datei hinzugefügt haben, unter ‚Zusätzliche Bibliotheksverzeichnisse‘
  4. überprüfen Sie auch Sie die lib unter ‚Linker> Input> zusätzliche Abhängigkeiten‘ hinzugefügt

Ich hoffe, das obige hilft.

+0

Vielen Dank für Ihre Antwort. Aber ich habe all das getan und habe das schon mehrmals überprüft. Wenn ich die raceinit.h und raceinit.cpp von ihrem ursprünglichen Verzeichnis in das Verzeichnis meines neuen Projekts kopiere, bekomme ich andere Fehler, aber ich denke nicht, dass das ein sehr guter Ansatz ist. –

Verwandte Themen