GCC学习笔记(二)

2014-11-24 08:28:23 · 作者: · 浏览: 1
#include
#include”math.h”
int main()
{
int sum = 0;
sum = add(4, 3);
printf(“sum:%d\n”, sum);
int result = 0;
result = divide(4,0);
printf(“result:%d”, result);
return 0;
}
这时我们就有疑问了,当前目录下的result可执行程序是修改之前的编译生成的可执行文件,那么修改之后就得重新编译一次。这里,由于我们使用的是多文件的方法,那么只需重新编译那些改动过的文件
,这里我们需要重新编译divide.c和main.c文件,前面一个大家自然理解,至于后面一个呢,那是因为main.c函数调用了divide函数,那要想使用更新后的函数,自然就的重新编译编译一边才可以享受更新服务了,这其实就是linux上常说的文件依赖。一个文件A依赖文件B,当文件B发生改动时,不仅文件B要重新编译,文件A也要重新编译一遍。这里由于其他文件没有发生改动,就无需重新编译一遍,
这样就大大的提高了编译的效率,这也是我们使用多文件管理的原因之一。
好了,说了那么多,让我们直接运行下代码看看结果先吧!
gcc -Wall main.o add.o divide.o -o result
结果显示说,分母y不能为0,看来程序正常运行了。
这次教程就到此为止。
(5)这一次教程,我们来说说关于linux下的库。库说白了其实就是一个个目标文件的集合。linux上一共有两种库文件类型,一种是以.a格式的静态链接库,另一种是以.so格式的动态链接库。下面我们来讲讲静态链接库。上一次的教程,我们生成了四个目标文件,分别add.o、minus.o、divide.o、multiply.o。这次,我们使用ar程序把这四个目标文件打包成一个静态链接库,以后要调用多个函数时,就不必一个一个的链接对应的目标文件。废话不多说,我们直接用代码来解释:
ar的使用格式:
ar cr libName.a file1.o file2.o file3.o …...
注释:libName.a中前缀lib和后缀.a固定,Name是静态链接库的名称。
ar cr libtest.a add.o、minus.o、divide.o、multiply.o
执行命令后,我们查看当前目录下的文件,就多出了一个libtest.a文件。接着,我们就直接使用libtest.a来重新编译源程序:
gcc -Wall main.c libtest.a -o result2
程序结果和之前的一样。我们也可以使用下面这种方法:
gcc -Wall main.c -L -ltest. -o result2
注意,上面的”-L.”不能缺少,因为,使用”-l“,编译器查找的是系统默认的库文件地址,而不是当前目录,故需要使用-L来说明库文件地址,由于我们的libtest.a在当前目录下,故直接使用“.”表示当前目录。以后,我们向别人提供第三方函数库时,如果不想让别人看到源代码,那么就可以只提供.a静态链接库和包含所有函数声明的头文件即可。
(6)在之前所有的教程里,我们都是把生成的目标文件、静态链接库以及头文件放在同一个文件夹下,这样不仅显得很杂乱,也不便管理源文件,一旦程序的文件数目庞大后,问题就愈加突出。下面我们就对程序文件整理一下,一般来说,头文件放在include 文件夹下,静态链接库lib文件夹下。下面先创建两个文件夹,并把相应的文件移动到对应文件夹下。
mkdir include
mkdir lib
mv libtest.a lib
mv math.h include
由于我们已经将四个目标文件(add.o、minus.o、divide.o、multiply.o)打包成静态链接哭libtest.a,那么就可以删除这四个文件:
rm add.o minus.o divide.o multiply.o
这是当前目录就只剩下main.c、add.c、minus.c、divide.c、multiply.c这五个源文件。
首先,我们用比较麻烦的方法一步步地来编译源文件,首先是生成目标文件,由于add.c、minus.c、divide.c、multiply.c这四个源代码的目标文件的已经生成并被打包到静态链接库中,故我们只需生成main.c的目标文件即可:
gcc -Wall -Iinclude -c main.c
这里-Iinclude中-I后面接的是main.c中所引用头文件(math.h)的地址,这里使用的是相对地址,其实也可以使用绝对地址,当由于不同的linux系统,他们的文件位置可能有写差异,这就造成我们程序的移植性很差,所以还是建议大家使用相对地址。
接下就链接目标文件即可。
gcc -Wall main.o -Llib -ltest -o result3
这里-Llib是-L后面接的是静态链接库的地址,由于我们的libtest.a在lib中,故接lib