【发布时间】: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"... 道歉并感谢您的帮助!