是代码或功能模块的一种封装形式。
库里面把代码或功能模块封装,它只提供访问它的接口说明,以及二进制代码。
库实现一个在源代码文件,调用二进制代码的一种方式。
动态库编译的过程
xxxx.c
xxxx.h
arm-linux-gcc -shared -fpic -o libxxxx.so xxxx.c
arm-linux-gcc xxxx.c -o libxxxx.so -shared -fpic
-shared 动态库
-fpic 与位置无关
libxxxxx.so 生成的静态库文件
xxxx.c C文件
eg:
FILE:func.c
#include<stdio.h>
#include"func.h"
int add(int x,int y)
{
printf("%d %d",x,y);
return x+y;
}
FILE:func.h
#ifndef __FUNC_H__
#define __FUNC_H__
int add(int x,int y);
#endif
执行:arm-linux-gcc func.c -o libfunc.so -shared -fpic
生成:libfunc.so
提供头文件func.h和libfunc.so库文件,供使用
编写测试文件
FILE:main.c
#include<stdio.h>
#include"func.h"
int main(int argc,char *argv[])
{
int result = add(3,5);
printf("%d\n",result);
return 0;
}
目录结构为:
klein@ubuntu:~/tftp/proj$ ls
include libs src
执行
klein@ubuntu:~/tftp/proj/src$ arm-linux-gcc main.c -o main -I ../include/ -L ../libs/ -l func
-I 说明头文件包含的路径
-L 说明要使用的静态库的存放目录
-l 说明要使用的静态库文件的名字(libxxxxx.so),只需输入xxxx就行了,如libfunc.so,输入func
生成main文件
可以直接下载到测试板子上运行,不过要把所依赖的libxxxx.so拷贝到实验板子的LD_LIBRARY_PATH下。
LD_LIBRARY_PATH: 是一个环境变量。Loading Library Path
加载库搜索路径。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your/lib/files/path
静态库:
arm-linux-gcc -c a.c -o a.o
arm-linux-gcc -c b.c -o b.o
1. a.c b.c 写代码,(.c, .h)
2. 把各源码文件编成.o 文件
arm-linux-gcc -c a.c -o a.o =>a.o
arm-linux-gcc -c b.c -o b.o =>b.o
3.用ar的命令把所有的.o文件,生成一个静态库
arm-linux-ar -rc libxxxx.a a.o b.o(功能函数)
把头文件和静态库拷贝给需要的人
main.c <-libsub.a里面的函数
(Include)-I接一个目录名,指定头文件的搜索路径,可以接多个-I
(lib)-l 指定一个库的名字, 可以接多个-l
-L指定一个库的搜索路径
(arm-linux-)gcc main.c -I./ -L./ -lsub -o main
生成的main这个可执行文件,直接把静态库libsub.a这个文件里面所有的内容
都编到可执行文件main中去了。
4.直接下载main,运行就可以了。
FILE:a.c
#include "a.h"
int max(int a,int b,int c){
return a>b?(a>c?a:c):(b>c?b:c);
}
FILE:a.h
#ifndef __A_H__
#define __A_H__
int max(int a,int b,int c);
#endif
arm-linux-gcc -c a.c -o a.o
生成a.o
arm-linux-ar -rc libmax.a a.o
生成静态连接库文件 libmax.a
FILE:main.c
#include<stdio.h>
9 #include"a.h"
10
11 int main(int argc,char *argv[])
12 {
13 int result = max(2,3,4);
14 printf("%d\n",result);
15 return 0;
16 }
arm-linux-gcc main.c -o main -I ./ -L ./ -l max
生成main执行文件
下载main到开发板子运行。