所有的事情都是有可能的 只要给我一个中间件(库)
库 是一种代码的二进制封装形式
为了实现代码的复用 以及方便开发
动态库 libXXX.so(xxx是库的名字,lib是前缀.so是后缀)
静态库 libxxx.a
1.动态库
1.编辑动态库源码
包含 .c和.h 每一个.c对应一个.h
不会有main函数
2.生成动态库
(arm-linux-)gcc -shared -fpic 文件列表 -o libxxx.so
xxx是库的名字
-shared 动态库
-fpic 与位置无关
3.怎么使用 把动态库和对应的.h拷贝给别人
cp
4.怎么编译
(arm-linux-)gcc main.c -I./ -L./ -lhello
-I 指定头文件搜索路径
-L 指定库的搜索路径
-l 库的名字 不带lib 和.so .a
报错:
./a.out: error while loading shared libraries: libhello.so:
cannot open shared object file: No such file or directory
打开库失败的原因 找不到动态库文件
执行的时候,依然要知道动态库哪里
执行的时候是通过环境变量去查找动态库的
LD_LIBRARY_PATH
有两种方式
1.执行一下命令将程序的动态库添加到搜索路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:你动态库的所在的绝对路径
重启终端后无效 除非去修改配置文件
2.将动态库放到系统库的路径下面去 比如/usr/lib 不推荐
如果是交叉开发 需要把动态库下载到开发板下面 然后设置环境变量
因为程序里面没有动态库的代码,运行时才会去找动态库
静态库
静态库也是一种库 是代码的二进制封装
动态库有什么区别,静态库在使用的时候,会把静态库中的内容编译到可执行文件中去
缺点是会导致可执行程序变大,占内存。运行的时候不需要动态库
编译静态库的时候需要先生成对应.o文件,才能生成静态库
1.生成目标文件 如果有多个文件就要多次生成
(arm-linux-)gcc -c hello.c -o hello.o
(arm-linux-)gcc -c 文件2.c -o 文件2.o
2.生成静态库
(arm-linux-)ar -rc libhello.a hello.o 文件2.o
再按照动态库的来编译
(arm-linux-)gcc main.c -I./ -L./ -lhello
NOTE
1.在利用库进行编译程序的时候,如果搜索路径下既有动态库
又有静态库,则优先使用动态库
如果想要优先使用静态库 加上-static选项
(arm-linux-)gcc main.c -I./ -L./ -lhello -static
2.如果是用静态库编译的程序,则下载程序的时候只需要下载程序就好了
不需要下载静态库
3.如果是用动态库编译的程序,则下载程序的时候既需要下载程序
也需要下载动态库,并设置环境变量等操作
使用动态库编译的程序,需要在运行时去动态库找资源
4.如果是交叉开,无论是库的生成还是中间文件编译,程序的编译
都需要使用交叉编译指令