首先,我们认识几个目录。头文件,位于/usr/include目录。头文件包含有常量定义、系统调用和库函数调用的声明。这是系统默认的头文件存放路径,在编译程序时,编译器会自动查找该目录。gcc编译器在编译程序时也可用-I参数指定另外的头文件路径。如:gcc -l /usr/local/myinclude test.h
库文件,库是一组已编译的函数集合,可方便我们重用代码。默认存放在/lib和/usr/lib目录。库文件可分为静态和共享两类。
.a,静态库文件。使用静态库将会把所有的库代码引入程序,占用更多的磁盘空间和内存空间,所以一般建议使用共享库。
.so,共享库文件。使用共享库的程序不包含库代码,只在程序运行才调用共享库中的代码。
在编译时可用包含路径的库文件名或用-l参数指定使用的库文件,/usr/lib/libm.a等价于-lm。如:gcc -o hello hello.c /usr/lib/libm.a
或用-l参数写成 gcc -o hello hello.c -lm ,如果我们要使用的库文件不在默认位置,在编译程序时可用-L参数指定库文件的路径。
下面通过编写一个静态库实现函数功能的例子来具体说明。
分别创建两个函数,函数a的内容如下:
函数b的内容如下:
接着,分别生成目标文件a.o和b.o
$ gcc -c a.c b.c
$ls *.o
a.o b.o
最后,用ar归档命令把生成的对象文件打包成一个静态库libhello.a。
$ ar crv libhello.a a.o b.o
a - a.o
a - b.o