1. 编写源文件
1. fun1.c
#include <stdio.h>
void Fun1(int arg)
{
printf("Fun1: we passed %d\n", arg);
}
2. fun2.c
#inclued <stdio.h>
void Fun2(char * arg)
{
printf("Fun2: we passed %s\n", arg);
}
上面两个.c文件是库中的函数实现所需的源文件 。
2. 编译产生目标文件
$ gcc -c fun1.c fun2.c
$ ls *.o
gcc -c 会生成 .o的目标文件如下图:
3. 调用函数的程序
首先为库文件创建一个头文件(lib.h),里面包含fnn1 和fun2的声明,并且他应该被调用程序(program.c)所在文件包含。
1.lib.h
// This is lib.h
#ifndef LIB_H
#define LIB_H
void Fun1(int);
void Fun2(char *);
#endif
2.program.c
#include <stdio.h>
#include "lib.h"
int main()
{
Fun2("Hello world!");
exit(0);
}
4. 编译并测试这个程序
$ gcc -c program.c
编译program.c文件生成.o目标文件;
$ gcc -o program program.o fun2.o
将program.o文件和fun2.o文件链接生成可执行程序program;
$ ./program
运行program可执行程序结果如下。
如图所示运行结果为Fun2: we passed Hello wprld!
5. 创建并使用库文件
###### 重点来了 ######
###### 重点来了 ######
###### 重点来了 ######
重要的事情说三遍,哈哈 !!!!!!!
现在可以使用ar
程序创建一个归档文件(即库文件),并将你的目标文件添加进去。
$ ar crv libfoo.a fun1.o fun2.o
如图所示libfoo.a
库文件已经创建成功,你的目标文件也添加进去了。下一步需要为库函数生成内容表才可以使用函数库。
$ ranlib libfoo.a
执行上述命令,你的函数库便可以使用了。
使用函数库创建你的程序
$ gcc -o program program.o libfoo.a
或者使用-L来访问函数库。
$ gcc -o program program.o -L. -lfoo
这里命令中的-L.
告诉编译器在当前目录中查找函数库(因为这个库不在标准位置,所有加-L项告诉编译器路径)。-lfoo
告诉编译器使用libfoo.a
的函数库。
6. 查看库中的函数
可以在命令行输入$ nm 'filename'
查看文件中的函数。
例如program中:
由上图可知program
可执行程序文件中只包含Fun2
函数;
但是在libfoo.a
中包含Fun1
、Fun2
两个函数,
所以,在program.c 中虽然包含lib.h头文件,但是在程序被创建时,只包含它实际需要的函数,不会将整个函数库包含在程序中。
写在最后的话:好了,今天的是静态库,以后再说说共享库!!!
最后的最后附上一段有趣的代码:
int main()
{
while (i.love( you ))
{
if (you.have( boyfriend ))
{
becomeFriends(you, i);
}
else
{
if (you.think( i.am( charming )))
{
string msg = "I love you";
cout << msg << you.have << endl;
}
else
{
i = you.Look4InAMan();
}
}
}
return 0;
}
如果你觉得我是一个有趣的人,我想那最好不过的了。
但事实往往是:
Error 404: Girlfriend Not Found.
哎,这不是我要的结果啊!!!!!(哭晕在厕所…)