【问题标题】:Unresolved external symbol error (LNK2019), after inlcuding headers包含标头后未解决的外部符号错误 (LNK2019)
【发布时间】:2012-04-02 16:41:27
【问题描述】:

我知道这个问题可能已经被问了一千次了,但我已经在这个问题上苦苦挣扎了好几天了。我对 C++ 相当陌生,这是我第一次使用 Visual Studio。

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

在 Linux 中使用 g++ 可以正常工作,但是当我尝试在 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.hraceinit.cpp 在我的名为 client 的解决方案中位于不同的项目中,它编译时没有错误。我还将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++ 兼容性问题(或者变得更糟,我什至不确定),但链接器问题仍然没有改变。

有什么想法吗?我现在有点推迟了,但我需要让这个工作,否则我的老板会生气:)

【问题讨论】:

  • 你导出新函数了吗?在 Linux 中,函数和类是默认导出的,而在 Windows 中则不是。这可以解释为什么链接器在 Windows 而不是 Linux 下抱怨
  • 表示 getisDerbyDuel() 有外部链接。在 C 中,外部链接是默认的。
  • 感谢您的回答,我在尝试您的建议后编辑了我的帖子。
  • 您的解决方案是否包括raceinit.cpp,即。它是否与其余资源一起编译?

标签: c++ linker visual-studio-2005 lnk2019


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    Visual Studio 对路径包含和库链接使用不同的方法。

    检查您的项目设置:

    1. 右键单击您的项目并选择“设置”
    2. 在“配置属性”下检查您拥有的“C/C++”下 将路径添加到您需要的标题中
    3. 现在在“链接器”下检查您是否已将路径添加到“附加”下的 lib 文件 图书馆目录的
    4. 还要检查您是否在“链接器>输入>附加依赖项”下添加了库

    希望以上内容有所帮助。

    【讨论】:

    • 感谢您的回答。但是我做了所有这些并且已经仔细检查了几次。如果我将 raceinit.h 和 raceinit.cpp 从它们的原始目录复制到我的新项目的目录中,我会得到不同的错误,但我认为这不是一个很好的方法。
    猜你喜欢
    • 2014-05-12
    • 2014-05-14
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2012-10-31
    相关资源
    最近更新 更多