【问题标题】:LNK2019: unresolved external symbol in functionLNK2019:函数中未解析的外部符号
【发布时间】:2013-11-20 03:53:58
【问题描述】:

我正在使用 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 但是,错误仍然存​​在。

【问题讨论】:

  • @JimLewis 是的。我已经编辑了我的帖子。

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


【解决方案1】:

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

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

【讨论】:

  • 我按照 EDIT1 中的说明进行了尝试。但是,错误仍然存​​在。另外,我在编辑前的原始帖子中尝试了不同的方法。那也没用。
  • @Gomu:你弄错了。您需要指示处理 file_1.cpp 的 C++ 编译器不要破坏。处理menu.c 的C 编译器不会出错。通常的方法是将该代码添加到标题中,以便所有使用该功能的翻译单元共享。
  • 好的。所以,我在eboot.h 中添加了那三行代码。现在,file_1.cpp 文件中的所有函数都出现了很多链接错误。
  • 如果menu.cfile_1.cpp在同一目录下,则编译时不会出错。但是,我不应该移动那个文件。还有什么可以尝试的?
  • @Gomu:您没有提供足够的信息。你如何链接不同的目标文件?你是如何编译的(也许你正在强制编译器将 menu.c 文件编译为 C++,而不管扩展名如何)......
【解决方案2】:

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

extern "C" VOID OALTestEMMC();

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

【讨论】:

  • 感谢您用插图解释!
  • file_1.obj 是否包含在链接器正在使用的文件列表中?可以包含 ./sources 文件的内容吗?
猜你喜欢
  • 2014-11-07
  • 2013-06-01
  • 1970-01-01
  • 2022-01-06
  • 2014-09-19
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
相关资源
最近更新 更多