C51编译警告“*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL” 及extern

本文详细解析了C51编译时遇到的“UNRESOLVEDEXTERNALSYMBOL”警告的原因及解决方法,同时介绍了extern关键字的正确使用方式,避免在多文件编程时出现未定义或重复定义的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C51编译警告“*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL”

 *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL

    SYMBOL:  ?C_START

    MODULE:  .STARTUP.obj (?C_STARTUP)

 *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL

    SYMBOL:  ?C_START

    MODULE:  .STARTUP.obj (?C_STARTUP)

    ADDRESS: 000DH

         如果你在用C51编译器出现上面的警告,并且找遍了网上也没能找出个究竟时,你是否觉得这个问题很难,难得以至于没人能回答呢?

        其实这个只是初学者和粗心者才会犯的错误:没把C文件添加到项目中!

///另外,还有可能是因为存在没有被调用的已经定义的函数。

 

源文档 <http://blog.163.com/paulucy@126/blog/static/94930282200911240504985/>

 

 


c/c++语言中有很多地方要用到extern,但是如果没有真正的了解它的意义,会给编程带来很大的麻烦,为了使大家少走弯路,特祥细的说明一下。

    对于比较小的程序,一般只有一个c文件和一个头文件,全局变量我们通常会直接定义在c文件中,在程序之前加int i定义。如果要在头文件中定义有以下两种方法:用extern来声明:extern int i;这一句只是对变量i进行声明,在c文件的程序之前必须加上int i进行定义。extern int i=0;这一句声明和定义都做了。

    对于大一点的程序,有很多c文件和头文件,这个时候全局变量就必须在头文件中声明,然后在一个c文件中定义。如果在头文件中定义,则编译的时候会出现重复定义的错误。如果只有头文件中声明就会出现没有定义有警告。

   *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS

       SYMBOL:  K

       MODULE:  222.obj (222)

  出现上述错误则是因为变量k重复定义,把你的头文件中的变量定义前加extern,再在某一个c文件的程序之前再定义一下就可以了。

    *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL

    SYMBOL:  K

    MODULE:  111.obj (111)

*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL

    SYMBOL:  K

    MODULE:  111.obj (111)

    ADDRESS: 000DH

*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL

    SYMBOL:  K

    MODULE:  222.obj (222)

*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL

    SYMBOL:  K

    MODULE:  222.obj (222)

    ADDRESS: 001FH

   这四个警告就是变量k在头文件中有声明,但是没有定义,只需在某一个c文件的程序之前定义一下即可。

*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: REV MODULE: .\Objects\uart1.obj (UART1) *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?UARTINIT?UART1 *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_UART1_SENDSTING?UART1 *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_PUTCHAR?UART1 *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?KEYSCAN_P0?KEY *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?TIMER0_INIT?TIME0 *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: KEY_SCANF MODULE: .\Objects\main.obj (MAIN) *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: KEY_CONFIG MODULE: .\Objects\main.obj (MAIN) *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: KEY_CONFIG MODULE: .\Objects\main.obj (MAIN) ADDRESS: 0004H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: KEY_SCANF MODULE: .\Objects\main.obj (MAIN) ADDRESS: 0007H *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: TIMER0 MODULE: .\Objects\time0.obj (TIME0) *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: TIMER0 MODULE: .\Objects\time0.obj (TIME0) ADDRESS: 0114H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: TIMER0 MODULE: .\Objects\time0.obj (TIME0) ADDRESS: 0116H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: TIMER0 MODULE: .\Objects\time0.obj (TIME0) ADDRESS: 011AH Program Size: data=16.0 xdata=0 code=325 Target not created. Build Time Elapsed: 00:00:01
05-28
Rebuild target 'Target 1' assembling STARTUP.A51... compiling main.c... compiling delay.c... compiling uart.c... linking... *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: COUNT MODULE: .\Objects\main.obj (MAIN) *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: RECV MODULE: .\Objects\main.obj (MAIN) *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: COUNT MODULE: .\Objects\main.obj (MAIN) ADDRESS: 00E2H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: COUNT MODULE: .\Objects\main.obj (MAIN) ADDRESS: 00E4H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: COUNT MODULE: .\Objects\main.obj (MAIN) ADDRESS: 00E6H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: COUNT MODULE: .\Objects\main.obj (MAIN) ADDRESS: 00EEH *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: COUNT MODULE: .\Objects\main.obj (MAIN) ADDRESS: 00F0H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: COUNT MODULE: .\Objects\main.obj (MAIN) ADDRESS: 00F4H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: COUNT MODULE: .\Objects\main.obj (MAIN) ADDRESS: 00F9H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: RECV MODULE: .\Objects\main.obj (MAIN) ADDRESS: 004AH *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: RECV MODULE: .\Objects\main.obj (MAIN) ADDRESS: 004CH *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: RECV MODULE: .\Objects\uart.obj (UART) *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: RECV MODULE: .\Objects\uart.obj (UART) ADDRESS: 001DH Program Size: data=12.0 xdata=0 code=393 creating hex file from ".\Objects\mcu51"... ".\Objects\mcu51" - 0 Error(s), 13 Warning(s). Build Time Elapsed: 00:00:02
07-31
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值