LNK2019:函数中未解析的外部符号

时间:2013-11-20 03:53:59

标签: c++ c visual-studio-2008 windows-ce

我正在使用VS2008 WinCE7。我在构建期间遇到链接错误。

文件系统结构是

menu.c - ./menu.c
eboot.h - ./eboot.h
file_1.cpp - ./dir1/file_1.cpp

其中.代表当前目录

menu.c

#include <eboot.h>

static VOID OALWriteToEMMC(OAL_BLMENU_ITEM *pMenu);

VOID OALWriteToEMMC(OAL_BLMENU_ITEM *pMenu)
{
     OALTestEMMC();
}

file_1.cpp

#include <eboot.h>

VOID OALTestEMMC();

VOID OALTestEMMC()
{
//some code
}

eboot.h

 VOID OALTestEMMC();

我收到了错误

menu.obj : error LNK2019: unresolved external symbol OALTestEMMC referenced in function OALWriteToEMMC

请指导我如何解决它。

EDIT1:

menu.c

#ifdef __cplusplus
extern "C" VOID OALTestEMMC();
#endif

并删除eboot.h中的声明并将其添加到file_1.cpp 但是,错误仍然存​​在。

2 个答案:

答案 0 :(得分:2)

您似乎正在编译C ++中的函数定义但是在C中使用该函数。如果不在C ++中使用函数extern "C",编译器将 mangle 这个名称,并且生成一个与C代码中使用的声明不匹配的符号。

如果要混合使用C和C ++,请确保将C ++中的声明标记为extern "C",以便编译器不会破坏名称并使用C调用约定。或者,用C ++(或C语言)编译所有内容

答案 1 :(得分:1)

大卫罗德里格斯的原始答案是正确的。您正在从C源文件调用C ++函数(OALTestEMMC)。正如David所说,C ++编译器将mangle函数名称。为了抑制名称修改以便menu.c中的代码可以调用它,将'extern“C”'限定符放在OALTestEMMC函数上(在file_1.cpp中):

extern "C" VOID OALTestEMMC();

extern "C" VOID OALTestEMMC() {
    // stuff
}