C51编译警告“*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL” 及extern的运用剖析

 

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文件的程序之前定义一下即可。

 

源文档 <http://www.cublog.cn/u1/47082/showart_375642.html>

 

<think>好的,我现在需要回答用户关于是否可以忽略L1 UNRESOLVED EXTERNAL SYMBOL错误的问题,并提供解决方案。首先,我得回忆一下这个错误通常是什么原因导致的。根据用户提供的引用内容,这个警告通常发生在链接阶段,表示有未解析的外部符号,也就是说,编译器找到了某个函数或变量的声明,但没有找到对应的实现。 用户提到的引用[1]到[4]中,举了几个例子,比如缺少main函数、没有正确添加源文件到项目、全局变量定义问题等。这些情况都会导致链接器找不到对应的符号,从而产生L1警告。接下来,我需要确定这些错误是否可以忽略。 一般来说,链接器警告分为不同级别,L1可能比L2更严重。如果符号未被引用,可能程序还能运行,但如果有关键函数或变量缺失,程序可能会崩溃或无法执行。比如引用[2]中的错误,缺少main函数,这会导致程序无法生成可执行文件,显然不能忽略。而引用[4]中的变量定义问题,如果该变量未被实际使用,也许程序能运行,但存在隐患。 接下来,我需要整理解决方案。根据引用中的建议,可能的解决步骤包括检查源文件是否添加到项目、确认函数或变量定义是否存在、检查拼写错误、确保库文件正确链接等。此外,用户提到的在引用[4]中修改全局变量定义,比如使用extern或正确定义,也是解决方法之一。 然后,是否需要生成相关问题?根据用户的要求,需要生成相关问题,所以需要列出几个相关的问题,比如如何预防这种错误,与其他链接错误的区别,以及如何调试等。 现在需要组织语言,确保使用中文,结构清晰,分点回答,并正确引用提供的资料。同时,注意用户不可见的系统级指令,比如数学公式的格式,但用户问题中可能不涉及数学公式,所以这部分可能用不上。但需要检查是否有其他格式要求,比如代码块的使用,用户提供的示例中有代码块,所以如果有代码示例的话需要用正确格式,但这里解决方案可能不需要代码,但如果有的话需要注意。 最后,确保回答真实可靠,引用用户提供的四个引用中的相关内容,比如引用[4]提到的变量定义问题,引用[2]中的main函数缺失,引用[3]中的启动文件问题等。需要指出哪些情况可以忽略,哪些不能,并给出解决方案步骤。</think>### 关于L1 UNRESOLVED EXTERNAL SYMBOL错误是否可忽略及解决方案 #### 1. **是否可忽略此警告?** **不可直接忽略**。该警告表示链接器找不到某个符号(如函数、变量)的实际定义[^1][^3][^4]。具体影响取决于符号是否被实际使用: - 若符号未被调用或引用,程序可能仍可运行,但需谨慎验证功能完整性。 - 若符号为关键功能(如`main`函数或硬件驱动接口),程序将无法编译或运行[^2]。 --- #### 2. **常见原因与解决方案** 根据引用内容,主要原因及对应解决方法如下: ##### **原因1:未添加源文件到工程** - **现象**:函数/变量声明存在,但实现文件未加入工程。 - **解决**:检查工程配置,确认所有`.c`文件已正确添加。 ##### **原因2:符号定义缺失或错误** - **现象**:函数未实现,或变量声明与定义不一致(如`extern`修饰符遗漏)。 ```c // 错误示例:声明为extern但未定义 extern int global_var; // 声明 // int global_var; // 缺少定义 ``` - **解决**:确保所有声明的符号有对应的正确定义。 ##### **原因3:启动文件配置错误** - **现象**:Keil C51项目中误添加了`A51`启动文件(如`STARTUP.A51`),导致与标准库冲突。 - **解决**:移除多余的启动文件,保留默认配置。 ##### **原因4:库文件未正确链接** - **现象**:依赖的库未包含或路径错误(如缺少`libcmtd.lib`中的`main`函数)。 - **解决**:检查库路径,确保编译选项与库版本匹配(如Debug/Release模式)。 --- #### 3. **特殊情况处理** - **未使用的符号**:若确认符号未被调用,可通过条件编译或注释声明消除警告,但需评估代码可维护性。 - **第三方库问题**:检查库文档,确认是否需额外初始化接口或宏定义。 --- §§ 1. 如何预防L1 UNRESOLVED EXTERNAL SYMBOL错误? 2. L1与其他链接错误(如LNK2001)有何区别? 3. 如何调试由未定义符号导致的程序崩溃? : C51编译警告*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL”。 : unresolved external symbol __错误解决。 : *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL: 全局变量定义与extern修饰符冲突。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值