用示例详解嵌入式linux上C语言最易出现的10个连接错误13482100207 [转载]

用示例详解嵌入式linux上C语言最易出现的10个连接错误13482100207 [转载]

连接错误示例

        连接过程中常见的错误是符号未找到(undefined reference)和符号重定义(redefinition)。由于在编译器在处理各个符号的时候,已经没有了各个C语言源文件的概念,只有目标文件。因此对于这种错误,连接器在报错的时候,只会给出错误的符号的名称,而不会像编译器报错一样给出错误程序的行号。

        符号未定义的错误经常发生在符号已经声明,但是并没有具体的定义的情况下。在C语言中,符号可以是一个函数,也可以是一个全局变量。在程序的编译过程中,只要符号被声明,编译就可以通过,但是在连接的过程中符号必须具有具体的实现才可以成功连接。

        例如:某一个源程序的文件的某一个地方调用了一个函数,如果这个函数具有声明,这时编译就可以通过。在连接的过程中,连接器将在各个代码段中寻找函数,如果函数没有在程序的任何一个位置中定义,那么就不会有函数符号,这时连接器将发生符号未定义的连接错误。请阅读如下程序:
                extern void function(void);
                int main(void) 
                {
                    /* ...... */
                    function ();
                    /* ...... */
                    return 0;
                }
        在以上的例子中函数function可以和其调用者main在同一个源文件中,也可以在其他的源文件被调用中,但是它必须被定义。

        符号重定义错误与符号未定义错误类似,如果连接器在连接的时候,发现一个符号在不同的地方有多于一个定义,这时就会产生符号重定义错误。对于同一个符号,如果在多个源文件中出现多次,将会产生符号重定义错误。

       知识点:在连接过程中,符号未定义和符号重定义是两种最基本的错误。
下面以一个包含3个文件的程序为例,说明在连接过程中的错误。这个程序的三个文件为hello.h、hello.c和main.c。

         main.c文件如下所示:
                #include "hello.h"

                int main(void) 
                {
                    hello();
                    string[0] = ''''a''
                    return 0;
                }

         hello.h文件如下所示:
                #ifndef HELLO_H
                #define HELLO_H

                void hello(void);
                extern char string [];
                #e

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值