函数库可以分为静态库和动态库
(1)静态库的同一函数被多次调用,则会有链接多次拷贝;
(2)动态库的同一函数被多次调用,则会尽在程序运行时内存中存在一份拷贝
在windows中,静态库的扩展名为.lib;动态库的扩展名为.dll;
在linux中,静态库的扩展名为.a,动态库的扩展名.so
动态库的搜索顺序
(1)环境变量LD_LIBRARY_PATH指定路径;
(2)/etc/ld.so.cache中缓存的动态库路径。可以通过修改配置文件/etc/ld.so.conf 增删路径(修改后需要运行ldconfig命令,实验室的板子不支持这种方式)
(3)默认的 /lib/;
(4)默认的 /usr/lib/
与动态链接库相关命令
(1)ld 是gcc的链接程序。
(2)ldd是查看可执行文件中所依赖的库的程序,比如想查main程序用到了那些动态库,可以直接 ldd main
(3)ldconfig用来更新文件/etc/ld.so.conf的修改生效。
(4)nm用来查看.so库中的函数名字,标记是T的就是动态库里面生成的名字。如:nm /lib/libc*.so
Ubuntu下静态库的创建和使用
创建库的.h文件 示例:mymath.h
#ifndef __MYMATH_H_ //防止头文件重复包含的条件编译
#define __MYMATH_H_
int getMax(int x,int y);
int getMin(int x,int y);
#endif
创建库的.c文件 示例:mymath.c
#include "mymath.h"
int getMax(int x,int y){
return x>y?x:y;
}
int getMin(int x,int y){
return x<y?x:y;
}
第一步、将库函数源文件生成目标文件命令
不需要.h文件
gcc -c -o mymath.o mymath.c
如果是arm版本则为
arm-linux-gnueabi-gnueabi-gcc -c -o mymath.o mymath.c
第二步、使用命令生成函数库命令:
ar rcs lib库名.a 目标文件列表
如果是arm版本则为
arm-linux-gnueabi-ar rcs lib库名.a 目标文件列表
例:
ar rcs libmymath.a mymath.o
如果是arm版本的则为:
arm-linux-gnueabi-ar rcs libmymath.a mymath.o
生成这样一个文件
编写测试程序main.c
#include <stdio.h>
#include "mymath.h"
int main(){
int x,y;
scanf("%d%d",&x,&y);
int max=getMax(x,y);
int min=getMin(x,y);
printf("max=%d,min=%d\n",max,min);
return 0;
}
第三步、使用gcc命令编译
gcc -o 可执行文件名 源文件列表 -L库路径 -l库名
例
gcc -o main main.c -L. -lmymath
然后就可以运行main可执行文件啦
Ubuntu下动态库的创建和使用
第一步、将mymath生成动态库
gcc -fpic -shared -o libmymath.so mymath.c
如果是arm开发版就要使用这个
arm-linux-gnueabi-gcc -fpic -shared -o libmymath.so mymath.c
第二步、动态库与源文件链接
gcc -o main main.c -L./ -lmymath
第三步、让动态链接库活起来
如果不配置动态链接库就会出现这情况
配置动态库的三种使用方法
1、将.so文件复制到/usr/lib目录下
2、将动态链接库的目录放到程序搜索路径中
可以将库的路径加到环境变量LD_LIBRARY_PATH中实现
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库.so
3.将动态链接库的目录放到/etc/ld.so.config.d文件夹中
先进入/etc/ld.so.config.d文件夹
sudo /etc/ld.so.conf.d
新建配置文件myprogram.conf
sudo vim myprogram.conf
文件内容就是你.so库目录的位置
# libc default configuration
/home/bees/myprogram/week5
注:一定要全路径,不能用~或$通配符
保存好配置文件,使用命令刷新动态库缓存(一定要加sudo)
sudo ldconfig
然后就可以运行与动态库链接的可执行文件了