gec@ubuntu:~$ gcc hello.c -o hello.i -E 预处理
gec@ubuntu:~$ gcc hello.i -o hello.s -S 编译
gec@ubuntu:~$ gcc hello.s -o hello.o -c 汇编
gec@ubuntu:~$ gcc hello.o -o hello -lc 链接
在Linux系统中,库(Library)是一组预先编译好的代码和数据,它们可以被其他程序或软件在运行时动态地加载和调用。
简单理解:就是把写好的代码封装到一个 .so (动态库) 或 .a (静态库) 的文件中,后续提供给别人使用。
代码复用:开发者可以将常用的代码段编译成库,供多个程序使用,避免重复编写相同的代码。
模块化:通过将程序划分为多个库,可以更好地管理和维护代码。每个库可以独立更新和优化,而不影响其他部分。
节省资源:动态库可以在多个程序之间共享,不需要每个程序都包含库的副本,这样可以节省磁盘空间和内存。
易于维护和更新:当库需要更新或修复bug时,只需要更新库文件本身,所有使用该库的程序都可以在不重新编译的情况下获得更新。
提高程序性能:库中的代码通常由专家优化,可以提供高效的实现,从而提高整个程序的性能。
保护代码的知识产权: 封装到库中的代码都是已经编译好的二进制代码,用户无法查看其源码。
1.动态库以 xxx.so 结尾 , 静态库以 xxxx.a 结尾。
2.动态库在编译阶段不会把代码编译进源程序中。
3.静态库在编译阶段会把代码编译进源程序中。
4.静态库的编译文件比较大,动态库编译的文件比较小。
5.动态库效率比静态库高,但是动态库的环境配置比较麻烦。
1.编写源码的.c 与 .h 头文件
xxxx.c
xxxx.h
2.把.c 文件编译成 .o 文件
gcc xxxx.c -o xxxx.o -c
3.把所有的xxx.o 文件封装到一个静态库 xxxx.a 中
ar crs lib??????.a xxx.o ......
例子:ar crs libstring.a string.o #把string.o 文件封装到静态库中
提示: ar -t 静态库名称 #查看当前静态库包含的 .o 文件
ar t libx.a #查看静态库中的文件
ar d libx.a b.o #删除静态库中的文件
ar r libx.a b.o #增加文件到静态库中
ar x libx.a #(x意即extract,将库中所有的*.o文件释放出来)
ar x libx.a a.o #(指定释放库中的a.o文件)
1.把库文件 和 所有头文件放入一个文件夹中
gec@PC-20240429TQJF:lib$ ls
a.out file.h lcd.h libPicture.a list.h main.c touch.h
2.链接静态库
gec@PC-20240429TQJF:lib$ gcc main.c -L./ -lPicture
-L : 说明当前静态库所在的目录
-l : 说明当前静态库的名称 libPicture.a 原名 -lPicture 链接名
1.编写源码的.c 与 .h 头文件
xxxx.c
xxxx.h
2.把.c 文件编译成 .o 文件
gcc xxxx.c -o xxxx.o -c -fPIC
3.把 所有的.o 封装成 xxx.so 动态库 , -fPIC与内存地址无关,方便跨平台使用
gcc -shared -fPIC -o libxxxx.so xxxx.o .......
1.把库文件 和 所有头文件放入一个文件夹中
gec@PC-20240429TQJF:lib$ ls
a.out file.h lcd.h libPicture.a list.h main.c touch.h
2.链接静态库
gec@PC-20240429TQJF:lib$ gcc main.c -L./ -lPicture
-L : 说明当前动态库所在的目录
-l : 说明当前动态库的名称 libPicture.a 原名 -lPicture 链接名
注意:动态库链接完毕后,必须把库文件放入系统的 /lib 目录下程序才能正常运行!
1.交叉编译生成 xxx.o
arm-linux-gcc xxxx.c -o xxxx.o -c
2.打包所有.o文件生成libxxxx.a
/usr/local/arm/5.4.0/usr/bin/arm-linux-ar crs libxxxxx.a xxxx.o ....
3.链接静态库
gec@PC-20240429TQJF:armlib$ ls
a.out file.h lcd.h libpic.a list.h main.c touch.h
gec@PC-20240429TQJF:armlib$ arm-linux-gcc main.c -L./ -lpic
4.把生成的可执行文件下载到开发板中运行即可
1.交叉编译生成 xxx.o
arm-linux-gcc xxxx.c -o xxxx.o -c -fPIC
2.打包所有.o文件生成libxxxx.so
arm-linux-gcc -shared -fPIC -o libxxxx.so xxxx.o .......
3.链接动态库
gec@PC-20240429TQJF:armlib$ ls
a.out file.h lcd.h libpic.a libpics.so list.h main.c touch.h
gec@PC-20240429TQJF:armlib$ arm-linux-gcc main.c -L./ -lpics -lpics 链接 libpics.so 动态库
4.把生成的可执行文件下载到开发板中
[root@GEC6818 /]#./a.out
./a.out: error while loading shared libraries: libpics.so: ❌出现问题!
5.把 libpics.so 动态库下载到开发板的 /lib 目录
至此,希望看完这篇文章的你有所收获,我是Bardb,译音八分贝,道友,下期见!