再读《C和指针》(笔记2)

用于编译和链接C程序的特定命令在不同的系统中是各不相同的。在绝大多数UNIX系统中,C编译器被称为cc,它可以用多种不同的方法来调用。
一:编译和链接
1.编译并链接一个完全包含于一个源文件的c程序:

cc program.c

这条命令会产生一个a.out的可执行文件。中间会产生一个名为program.o的目标文件,但它在链接过程完成后会被删除。
2.编译并链接几个C源文件:

cc main.c sort.c lookup.c

当编译的源文件超过一个时,目标文件便不会被删除,这就允许我们对程序进行过改动的源文件进行重新编译。假如我改动了sort.c,那么我只需要重新编译sort.c,再把已经编译好的main.o,lookup.o和现在编译的sort.o进行链接就可以了:

cc main.o lookup.o sort.c

对于C源文件很多的庞大工程来说,如果不像上面这么做,想象一下,仅仅因为一点小小的改动就要重新编译整个工程是多么可怕的一件事。
3.编译单个C源文件,并产生一个目标文件,但用于以后的链接:

cc -c program.c

4.编译几个C源文件,并且为每个文件产生一个目标文件:

cc -c main.c sort.c lookup.c

5.链接几个目标文件:

cc main.o sort.c lookup.o

我们可以给上面那些能够产生可执行文件的命令加上“-o name”这个选项,它可以使连接器把可执行程序保存在“name”文件中,这样产生的就是name.out可执行文件而不是a.out文件了。

如果在编译时加上“-lname”标志,连接器就会同时在“name”的函数库中进行查找。这个选项应该出现在命令行的最后。

二:执行
程序的执行过程需要经历几个阶段。
1.首先,程序必须被载入到内存中
在宿主环境中(也就是具有操作系统),这个任务由操作系统完成,那些存储在堆栈中尚未得到初始化的变量将在这个时候得到初始化。
而在独立的环境中,例如单片机中的C程序,程序的载入就必须由手工安排,也可能是通过把可执行代码置入只读内存(ROM)中来完成。
2.然后,程序开始执行。在宿主环境中,通常一个小型的启动程序于程序链接在一起,负责处理一系列日常事务,例如收集命令行参数等。接着,开始调用main函数。
3.现在,开始执行程序代码。在绝大多数机器里,程序都使用一个运行时堆栈,这个堆栈用于存储函数的局部变量和函数的返回地址。程序也可以使用静态内存,存储于静态内存中的变量在程序的整个执行过程中都将一直保留他们的值。
4.最后,程序终止。正常的终止就是main函数的返回,也可能是用户终止了程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值