我知道这个问题可能已经被问了一千次了,但我已经在这个问题上咬了好几天了。我对 C++ 相当陌生,这是我第一次使用 Visual Studio。
我正在尝试修改 TORCS 赛车模拟器以在我的大学进行比赛。其中大部分已经完成,所以我发布的只有部分内容实际上是我的代码。但是我向它添加了一些新功能,但我遇到了麻烦。
整个事情在带有 g++ 的 Linux 中运行良好,但是当我尝试在 Visual Studio 2005 中编译它时,我得到一个未解决的外部符号错误。
我在解决方案中添加了一个新项目,它使用了其他项目的功能。
在这个新项目中,我调用了这个函数:
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 ==========
任何想法都值得赞赏,我不知道该尝试什么了。
编辑:
感谢您的回答。我尝试更改外部的东西,所以标志本身在头文件中被声明为外部,而 getter 不是(和几种组合)但似乎没有任何改变错误输出。
我不确定导出函数是什么意思。一个快速的谷歌搜索让我明白了这一点:
[..]
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++ 兼容性问题(或者变得更糟,我什至不确定)但链接器问题保持不变。
有任何想法吗?我现在有点迟疑了,但我需要让这个工作,否则我的老板会生气:)