一、《Linux程序设计》
(一)
1.Gun c/cc++编译器的各个工具和GNU专用的头文件都保存在/usr/lib/gcc的子目录里
2.对c语言来说,头文件位于/usr/include目录及其子目录中
3.用-I(大写的i)包含保存在子目录或非标准位置中的头文件,如:
gcc -I/usr/opemwin/include fred.c
它指示编译器不仅在标准位置,也在/usr/openwin/inclde目录中查找程序fred.c中2包含的头文件 ,更多用法:man gcc
4.巧用grep,如搜索返回退出状态的#define定义的名字,前提是切换到/usr/include目录下
grep EXIT_ *.h
(二)
1.标准系统库文件一般在/lib和/usr/lib目录中
c代表c库,m代表数学库 .a:传统的静态函数库 .so:共享函数库
函数库:(1)静态库 (2)共享库 可用ls /usr/lib查看
2.gcc -o fred fred.c /usr/lib/libm.a
编译器编译文件fred.c,将编译后产生的程序文件命名为fred,并且除了搜索标准的c语言函数库外,还搜索数学库以解决函数引用问题
gcc -o fred fred.c -lm
-lm;标准函数库中名为libm.a的函数库,-lmm标志的另一个好处是如果有共享库,编译器会自动选择共享库
3.用-L增加库的搜索路径,如:
gcc -o x11.fred -L/usr/openwin/lib xllfed.c -lx11
这条命令用/usr/openwin/lib目录中的libx11库版本编译和链接程序x11fred
4.创建一个小型函数库
(1)为函数(bill、fred)创建各自的源文件(也就是子函数)
第一个源文件:
#include<stdio.h>
void fred(int arg)
{
printf("fred: we passed %d\n", arg);
}
第二个源文件:
#include<stdio.h>
void bill(char *arg)
{
printf("bill: we passed %s\n", arg);
}
(2)gcc -c bill.c fred.c -c:阻止编译器创建一个完整的程序,因为此时还未定义main函数
ls *.o
bill.o fred.o
(3)编写一个调用bill函数的程序。首先,为库文件创建一个头文件,这个头文件将声明库文件中的函数,所有希望使用这个库文件的应用程序包含这个头文件,fred.c和bill.c里包含这个头文件
void bill(char *);
void fred(int);
(4)调用程序(program.c)它包含头文件并且调用库中的一个函数
#include<stdlib.h>
#include "lib.h"
int main()
{
bill("Helo World");
exit(0);
}
(5)编译测试程序,为编译器指定目标文件,要求编译器编译program.c并与先前编译好的目标模块bill.o链接
gcc -c program.c
gcc -o program program.c bill.o
./program
bill: we passed Hello World
(6)创建并使用一个库文件。用ar程序创建一个归档文件并将目标文件添加进去。注意:ar程序可以用来创建任何类型文件的归档文件
ar crv libfoo.a bill.o fred.o
显示的内容:a - bill.o
a - fred.o
(7)在某些系统中,尤其是从Berkeley UNIX衍生的系统中,要想成功地使用函数库,还需要为函数库生成一个内容表。可以用ranlib命令来完成。在Linux中,当使用的是GNU的软件开发工具时,这一步骤可省略(做了也无妨)
ranlib libfoo.a
现在可以使用函数库了
gcc -o program program.o libfoo.a
./program
显示的内容;bill: we passed Hello World
5.可以用-l访问函数库,但因其未保存标准位置,所以必须使用-L告诉编译器在何处可以找到它
gcc -o program program.o -L. -lfoo
若要查看哪些函数被包含在目标文件、函数库或可执行文件里,可以使用nm命令
6. 共享库
/usr/lib/libm.so