错误:L6218E:未定义的符号三()

时间:2017-02-02 02:12:13

标签: c linker keil

[编辑:问题是有缺陷的,我描述为“main.c”的文件实际上是“main.cpp”,这就是我遇到问题的原因,从C ++文件调用C函数。问题因此是错误的,没有答案,但如果你有这个未定义的符号问题,也要考虑检查你是不是在混合C& C ++。]

我正在使用uVision 5开发固件,但我无法让链接器找到我的一个功能。

main.c:

#include "Test.h"

int main()
{
  return three();
}

Test.h:

#ifndef TEST_H
#define TEST_H

int three();

#endif

TEST.C

#include "Test.h"

int three()
{
    return 3;
}

所有这些文件都是我项目的根目录,我知道它们被编译好像我在其中引入了语法错误,编译器报告错误。 另外看一下生成的地图文件,我看到三个()被删除了:

Removing test.o(i.three), (4 bytes).

出于测试目的,我有--no_remove到链接器命令行,map文件现在包含:

0x0002ba76   0x00000004   Code   RO            1    i.three             test.o

很明显,链接器很清楚我的功能,并且会根据标记删除它。

无论如何,它报告:

.\build\uvision5\test.axf: Error: L6218E: Undefined symbol three() (referred from main.o).
Not enough information to list image symbols.

1 个答案:

答案 0 :(得分:1)

有缺陷的问题,实际上是混合使用C / C ++的情况,在这种情况下,如果从C ++调用C函数而不将其声明为extern C,则会丢失一个符号。