LoopFillZerobss对main有一个未定义的引用
LoopFillZerobss has an undefined reference to main
我正在为STM32F4微控制器编译一个c ++应用程序。我的所有代码都已成功编译,但链接步骤失败,并显示以下错误:
/tmp/ccGj7Wge.o: In function `LoopFillZerobss':
(.text.Reset_Handler+0x32): undefined reference to `main'
collect2: error: ld returned 1 exit status
我熟悉未定义引用主要错误的典型原因,也就是说,尝试在没有主节点的情况下编译应用程序。但是,我确实有一个主要功能.cpp,当然,其中有一个主要功能。它编译到 main.o,并与创建的其他目标文件链接在编译期间。
我正在交叉编译到STM32F407并且我正在运行裸机。
有人对此有任何见解或以前见过此错误吗?我唯一看到LoopFillZerobss的地方函数位于电路板的程序集启动文件中。
要检查的事项:
- 确保正确声明
main
。 例如,int main(void)
或int main(int argc, char **argv)
,而不是void main(void)
。 这篇 Stack Overflow 文章做得很好:什么是 main 的正确声明? - 确保您没有意外地将
main
包裹在namespace
中。 - 如果你有一个非常古怪的C++编译器,你可能需要
main
标记为extern "C"
,但说实话,我从未见过需要它的工具。
您应该能够通过在其上运行nm
等工具来查看您的main.o
定义了哪些符号。 (至少,UNIX风格的工具链,如GNU工具链,提供了一个nm
工具。 nm
将列出可执行文件定义的符号集。 您应该会看到按原样列出的main
。
例如,在我的 Linux 盒子上,在其他空.cpp文件中int main(void) { }
会导致以下来自 nm 的输出:
$ nm main.o
U __gxx_personality_v0
0000000000000000 T main
如果我将main
包装在命名空间中(在本例中为 namespace fred
(,我会得到一个像这样的损坏名称:
$ nm main.o
0000000000000000 T _ZN4fred4mainEv
U __gxx_personality_v0
请注意名称周围的额外喋喋不休 main
. 你不应该在你的nm
输出中看到这样的胡言乱语。
您应该能够查看是否正确声明了main
,而不是意外地将其放入命名空间中。 一旦你得到了排序,那么初始化例程LoopFillZerobss
应该会更快乐。
相关文章:
- 编译C++时未定义的引用
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 未定义的引用在哪里
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 对 Scalar ::Scalar() 的未定义引用
- 已定义函数时出现 G++ "未定义的引用"错误
- 链接 cmake 时出现未定义的引用错误
- 对复制 CTOR 和 CTOR 的未定义引用
- 错误:未定义对'oboe::AudioStreamBuilder::openStream(oboe::AudioStream**)'的引用
- 右值引用未定义的行为
- 对"vtable for DigitalClock"的未定义引用 - 未定义对"DigitalClock::staticMetaObject"的引用 - Qt
- 函数类型到函数类型的引用:未定义的引用
- avcodec_alloc_context引用未定义,但ffmpeg链接顺序正确
- 从c++调用Fortran子程序,链接时引用未定义
- 枚举引用未定义,但位于包含的头文件中