在包含标题后,未解决的外部符号错误(LNK2019)

Den*_*rtz 3 c++ linker visual-studio-2005 lnk2019

我知道这可能已被问过一千次,但是我已经在这个问题上咬了几天了.我是C++的新手,这是我第一次使用Visual Studio.

我正在尝试修改TORCS赛车模拟器,以便在我的大学参加比赛.大部分已经完成,所以我发布的部分内容实际上只是我的代码.但我添加了一些新的功能,我遇到了麻烦.

整个过程在使用g ++的Linux中运行良好但是当我尝试在Visual Studio 2005中编译它时,我得到一个未解决的外部符号错误.

我在解决方案中添加了一个新项目,该项目使用其他项目的功能.

在这个新项目中,我调用了函数:

getisDerbyDuel()
Run Code Online (Sandbox Code Playgroud)

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_ */
Run Code Online (Sandbox Code Playgroud)

并定义于raceinit.cpp:

 bool _isDerbyDuel = true;

void setisDerbyDuel(bool isDerbyDuel) {
    _isDerbyDuel = isDerbyDuel;
}
bool getisDerbyDuel(void) {
    return _isDerbyDuel;
}
Run Code Online (Sandbox Code Playgroud)

raceinit.hraceinit.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 ==========    
Run Code Online (Sandbox Code Playgroud)

任何想法都很受欢迎,我不知道该怎么办.


编辑:

谢谢你的回答.我尝试更改外部事物,因此标志本身在头文件中声明为外部,而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;
[...]
Run Code Online (Sandbox Code Playgroud)

extern "C" {
#include <raceinit.h>
}
Run Code Online (Sandbox Code Playgroud)

这将错误输出更改为:

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
Run Code Online (Sandbox Code Playgroud)

我只是不知道这里有什么不对.


编辑二:

因此,在阅读了导入/导出功能后,我调整了我的代码.
现在声明未解析函数的头文件如下所示:

#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;
Run Code Online (Sandbox Code Playgroud)

我调用该函数的文件没有头文件,但我尝试根据文件中的其他函数声明导入的函数:

[...]
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);
[...]
Run Code Online (Sandbox Code Playgroud)

包含的标题与其他标题一样,函数调用如下:

if (getisDerbyDuel()) {
[...]
Run Code Online (Sandbox Code Playgroud)

错误输出现在更改为:

error LNK2019: unresolved external symbol _getisDerbyDuel referenced in function _drive
Run Code Online (Sandbox Code Playgroud)

所以在我看来,如果我刚刚解决了一些C/C++兼容性问题(或者更糟糕,我甚至不再确定),但链接器问题仍然没有改变.

有任何想法吗?我现在有点迟了,但我需要让它工作,否则我的Boss会生气:)

Den*_*rtz 6

正如我所说,我是Visual Studio的新手,但这仍然有点令人尴尬.我发现了我的错误,它实际上不在我的代码中.
除了链接器输入等,我还必须将包含raceinit.cpp的项目添加到我的新项目中的引用.这解决了我的问题.