【问题标题】:Error: L6218E: Undefined symbol three()错误:L6218E:未定义符号三()
【发布时间】:2017-06-18 23:44:07
【问题描述】:

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

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

main.c:

#include "Test.h"

int main()
{
  return three();
}

测试.h:

#ifndef TEST_H
#define TEST_H

int three();

#endif

测试.c

#include "Test.h"

int three()
{
    return 3;
}

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

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

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

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.

【问题讨论】:

  • 我刚刚试用了您的代码,它使用通用的 ARM Cortex M0 对我来说构建得很好。您确定将test.c 添加到您的项目并进行编译吗?
  • 谢谢纪尧姆。错误在别处,我的问题是不正确的,main.c 实际上是 main.cpp,所以函数必须声明为 extern "C"... 道歉并感谢您的帮助!

标签: c linker keil


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-09-18
    • 2020-04-02
    • 2017-07-27
    • 1970-01-01
    • 2012-10-10
    • 2013-10-22
    • 2014-06-01
    • 2015-11-13
    • 1970-01-01
    相关资源
    最近更新 更多