C语言链接过程会遇到的问题以及解决方法

本文详细介绍了C语言链接过程中常见的符号未定义和符号重定义错误,通过实例分析了错误产生的原因及解决方案。包括无数据定义、无函数实现、静态变量与函数的限制、同名变量与函数的重定义、头文件中初始化数据的影响等,强调了头文件中不应定义变量和函数,而应仅声明。
摘要由CSDN通过智能技术生成

    连接过程中常见的错误是符号未找到(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 [];
            #endif

     hello.c文件如

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值