我在一个目录下新建hello.h hello.c main.c三个文件,我们需要将hello.c文件编译成静态库以及动态库。在存放文件目录下打开一个终端。
三个文件
hello.h(见程序1)为该函数库的头文件。
hello.c(见程序2)是函数库的源程序,其中包含公用函数hello,该函数将在屏幕上输出”Hello XXX!”。
main.c(见程序3)为测试库文件的主程序,在主程序中调用了公用函数hello。
hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif
hello.c
#include <stdio.h>
#include <hello.h>
//这是要被编成函数库的,可以变成静态函数库和动态函数库
void hello(const char *name){
printf("hello %s.\n",name);
}
main.c
#include <stdio.h>
#include <hello.h>
int main(int argc , char *argv[])
{
hello(every one);
return 0;
}
linux下的库本质上来说是一种可执行代码的二进制形式,可以被操作系统载入内存执行,库有两种:静态库和共享库(动态库)。
二者的不同点在于代码被载入的时刻不同。
静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。创建程序后静态库可以删除也没有影响。
共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。所以共享库搜索路径很重要,如果搜索不到,程序运行时候奔溃。
在linux下,库文件一般放在/usr/lib和/lib和/usr/local/lib下,
静态库的名字一般为libxxxx.a,其中xxxx是该lib的名称
动态库的名字一般为libxxxx.so.major.minor,xxxx是该lib的名称,major是主版本号, minor是副版本号
无论静态库,还是动态库,都是由.o文件创建的。因此我们必须将源程序hello.c通过gcc先编译成.o文件。
创建静态链接库
第一步就是将hello.c 编译为hello.o文件。
但是遇到第一个问题,就是说找不到hello.h文件。
有两个解决方法。
1、第一个用-I选项指明头文件的路径。如下表示hello.h在当前目录下。gcc -c -I ./ hello.c
2、在/etc/profile文件里面增加include路径搜索目录,<