Я знаю, что об этом спрашивали, наверное, тысячу раз, но я уже несколько дней грызу ногти на этом.Я довольно новичок в C ++, и я впервые использую Visual Studio.
Я пытаюсь модифицировать гоночный симулятор TORCS для соревнований в моем университете.Большая часть этого уже сделана, поэтому только часть того, что я публикую, на самом деле является моим кодом.Но я добавил несколько новых функций, и у меня возникли проблемы с ними.
Все это прекрасно работало в Linux с g ++, но когда я пытаюсь скомпилировать его в Visual Studio 2005, я получаю неразрешенную внешнюю ошибку символа.
Я добавил новый проект в Solution,который использует функции из других проектов.
В этом новом проекте я вызываю функцию:
getisDerbyDuel()
, которая объявлена в raceinit.h
, которую я включил в новый проект.
#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_ */
и определено в raceinit.cpp
:
bool _isDerbyDuel = true;
void setisDerbyDuel(bool isDerbyDuel) {
_isDerbyDuel = isDerbyDuel;
}
bool getisDerbyDuel(void) {
return _isDerbyDuel;
}
raceinit.h
и raceinit.cpp
находятся в разных проектах в моем решении под названием клиент, который компилируется без ошибок.Я также добавил client.lib
к зависимостям в моем проекте.
При компиляции я получаю следующий вывод:
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)" (?getisDerbyDuel@@YA_NXZ) referenced in function "void __cdecl drive(int,struct CarElt *,struct Situation *)" (?drive@@YAXHPAUCarElt@@PAUSituation@@@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 ==========
Любые идеи приветствуются, я не знаю, что попробовать.
РЕДАКТИРОВАТЬ:
Спасибо за ваши ответы.Я попытался изменить внешний элемент, поэтому сам флаг объявлен как внешний в заголовочном файле, а метод получения - нет (и несколько комбинаций), но, похоже, ничто не меняет вывод ошибки.
Я не совсем уверен, чтоподразумевается экспорт функций.Быстрый поиск в Google привел меня к этому:
[..]
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;
[...]
и
extern "C" {
#include <raceinit.h>
}
Что изменило ошибку Вывод на это:
1>championship2010server.obj : error LNK2019: unresolved external symbol __imp__getisDerbyDuel referenced in function "void __cdecl drive(int,struct CarElt *,struct Situation *)" (?drive@@YAXHPAUCarElt@@PAUSituation@@@Z)
1>.\Release/championship2010server.dll : fatal error LNK1120: 1 unresolved externals
Я просто незнать, что здесь не так.
РЕДАКТИРОВАТЬ ВТОРОЕ:
Итак, после прочтения о функциях импорта / экспорта я скорректировал свой код.
Файл заголовка, где находится неразрешенная функцияобъявленный сейчас выглядит следующим образом:
#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;
Файл, в котором я вызываю функцию, не имеет файла заголовка, но я попытался объявить импортированную функцию в соответствии с другими функциями в файле:
[...]
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);
[...]
Заголовок включен, как и любой другой, и функция вызывается так:
if (getisDerbyDuel()) {
[...]
Теперь вывод ошибки изменился на:
error LNK2019: unresolved external symbol _getisDerbyDuel referenced in function _drive
Так чтоМне кажется, что если я только что решил проблему совместимости с C / C ++ (или сделал ее еще хуже, я даже больше не уверен), но проблема компоновщика осталась неизменной.
Есть идеи?Сейчас я немного откладываю, но мне нужно, чтобы это сработало, иначе мой босс разозлится:)