动态链接库和静态链接库的建立和使用

来源:互联网 发布:mac 鼠标右键 触摸屏 编辑:程序博客网 时间:2024/05/17 04:32

1. 静态函数库    

 

这类库的名字一般是 libxxx.a ;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为 如果静态函数库改变了,那么你的程序必须重新编译 。

Linux下静态链接库的使用和建立

 例程:quick_sort.c  shell_sort.c quick_sort.h  shell_sort.h  main.c

 具体文件代码见快速排序中的相应文件。

第一步:gcc -c quick_sort.c shell_sort.c生产链接文件,表示和.h已经链接好了quick_sort.o  shell_sort.o

第二步:静态函数库的创建 ar 命了创建。

ar cr libmy_sort.a quick_sort.o shell_sort.o

-c : create 的意思   

-r :replace 的意思,表示当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar 显示一个错误消息,并不替换其他同名模块。   

-s: 代表若归档文件中包含了对象模式(C++) 。

libmy_sort: lib表示库,my_sort表示自己建立的库的名字。

第三步:使用静态库

gcc –Wall -o main main.c -L. -lmy_sort 

生产的mian执行文件已经将静态链接库全部包含在里面,就可以直接运行了。

静态库制作完了,如何使用它内部的函数呢?只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明静态库名(是mymath 而不是libmymath.a ),gcc将会从静态库中将公用函数连接到目标文件中。注意,gcc会在静态库名前加上前缀lib,然后追加扩展名.a得到的静态库文件名来查找静态库文件。

2. 动态函数库

Linux下动态链接库的使用和建立

第一步:创建:

动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但其文件扩展名为.so。

gcc -shared -fPCI -o libmy_sort.so quick_sort.o shell_sort.o

第二步:使用

gcc –Wall -o main main.c -L. -lmy_sort   

执行文件知道了执行的时候要去找-lmy_sort

./main

出现错误,./main: error while loading shared libraries:libmymath.so: cannotopen shared object file: No such file or directory

这是由于在运行main的时候,其要去找链接库-lmy_sort,一般都是去/lib-->/usr/lib-->/usr/local/lib这几个中寻找的,,找不到就会出现错误,不能执行,这个时候就要将文件libmy_sort.so复制到目录/usr/lib中:

cp libmy_sort.so /usr/lib

或者改变环境变量,将默认路径转换成我们自己定义的路径。

(这一部分后续有待增加)

 

 

gcc -Wall -o main main.c -I /home/share/quick/ -L/home/share/include/ -lmy_sort

gcc -Wall -o main main.c -I /home/share/quick/ -L/home/share/include/ -lmy_sort

-Wall   打开gcc的所有警告

gcc -I -L -l的区别:
       gcc -o hello hello.c -I/home/hello/include -L /home/hello/lib -lworld

       上面这句表示在编译main.c-I/home/share/quick/表示将/home/share/quick/目录作为第一个寻找头文件的目录,

 寻找的顺序是:/home/share/quick/-->/usr/include-->/usr/local/include

 -L/home/share/include/表示将/home/share/include/目录作为第一个寻找库文件的目录,

 寻找的顺序是:/home/share/include/-->/lib-->/usr/lib-->/usr/local/lib

       -lmy_sort表示在上面的lib的路径中寻找-lmy_sort.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找-lmy_sort.a静态库文件)

 

0 0
原创粉丝点击