错误:L6218E:未定义的符号main(引自__rtentry2.o)

时间:2015-08-11 08:39:23

标签: arm keil

谁能帮帮我?我的电路板是LPC1768,传感器是BMP180

Rebuild target 'Target 1'
compiling BMP180.c...
compiling I2C.c...
assembling startup_LPC17xx.s...
compiling system_LPC17xx.c...
compiling GPIO_LPC17xx.c...
compiling PIN_LPC17xx.c...
linking...
.\Objects\asdsa.axf: Error: L6218E: Undefined symbol main (referred from __rtentry2.o).
Not enough information to list image symbols.
Finished: 1 information, 0 warning and 1 error messages.
".\Objects\asdsa.axf" - 1 Error(s), 0 Warning(s).
Target not created.

6 个答案:

答案 0 :(得分:0)

我通过以下步骤解决了这个问题;

  1. 删除旧项目并创建新项目
  2. 从管理运行时环境中选择真正的库,如下所示: Manage Run Time Environment
  3. 配置"目标选项"分割。定义符号USE_STDPERIPH_DRIVER并定义项目路径,如下所示: Options for Taget
  4. 测试您的配置。请写下以下代码:

     #include "stm32f10x.h"                  // Device header
    
     int main() {
     }
    

答案 1 :(得分:0)

我发现该解决方案很容易,但是在深入探讨该解决方案之前,请记住,C编译单元(至少是C Compiler和Assembler)在解决了必要的预处理程序指令后会编译每个纯C源文件,并生成一个通过编译可重定位的目标文件。

在编译单元完成工作后,还有另一个单元负责将成功编译的每个源文件分别组合为一个大对象文件的可重定位形式。该单元称为 Linker ,操作称为 Linking

可重定位目标文件中的一个非常重要的功能是所谓的变量,到目前为止,函数将被标记为符号。链接器必须解析符号,定义对象文件中最初定义的内容,然后将另一个对象中使用的内容引用到其原始对象文件中。

根据这种动机,现在我们可以将 main() function 称为 main() symbol 。< / p>

我发现问题是因为包含 main()函数的源文件未编译。结果,没有可重定位的目标文件包含与 main()函数相对应的符号。因此,编译器在抱怨:您要求我使用(引用)一个保证可以在另一个文件中找到(定义)的符号,但我没有找到这样的符号!

解决方案:

对于Kiel IDE,将源文件排队进行编译;您可以通过右键单击将新文件添加到组中,或将现有文件添加到组中,在“源组”类别中将其入围。它将导致如下图所示:

source that contains *main* function must be added to Source Group category in Keil IDE

现在我们有了一个主要功能,稍后将其转换(定义)为主要符号,并由链接程序找到以将其引用为任何其他可重定位目标文件中使用的符号。

答案 2 :(得分:0)

我遇到了同样的问题。问题是 .c 文件中的函数名称与 .h 文件中的函数名称不同,我不知道。

答案 3 :(得分:0)

只需将您的 c 文件(例如:'main.c')添加到 源组(例如:'源组 1'),然后展开 目标 然后向右单击源组,选择将现有文件添加到“您的源组”组,然后选择 main.c 文件。

答案 4 :(得分:-1)

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/14222.html 这应该有所帮助。 只需创建一个虚拟的main()或main.c文件。链接器无法在您的pjt中找到它。

答案 5 :(得分:-1)

对于解决方案,仅将此文件C添加到驱动程序文件夹并进行翻译, enter image description here