搜集、整理、加上了一些自己的理解。
Linux下有两种库文件:
1、静态库---- xxx.a
2、动态库---- xxx.so
//TODO 动态库,静态库区别:
1、链接方式:
静态库在编译的时候会链接到程序。
动态库在加载时指定程序的跳转位置。---有点忘了,后续补充吧。
查看一个程序对库的依赖:
使用ldd命令可以查看程序依赖哪些库。
动态库加载:
elf可执行程序是由ld-linux.so*完成加载的。它会查找/lib, /usr/lib目录下的动态库。
如果你编写的动态库不在这两个默认目录系,那么就需要你提供信息给加载器,
告诉它你的动态库路径。步骤如下:
1、在/etc/ld.so.conf.d目录下建立一个config文件, xxx.conf。内容指定你的动态库目录。
2、运行ldconfig,重建/etc/ld.so.cache文件。
另外,gcc的环境变量LIBRARY_PATH可以告诉j加载器库目录。
静态库、动态库的创建:
库文件都是有xxx.o目标文件组成。所以需要把源文件都编译成xxx.o。
gcc -o xxx.c
1、创建静态库:
使用ar命令。
ar rcs xxx.a xxx.o
链接静态库
gcc -o ... -static -L. -lxxx
2、创建动态库:
使用gcc来创建动态库。
gcc -shared -fPIC -o xxx.so xxx.o
链接动态库
gcc -o ... -L -lxxx
这些过程大多数都被隐藏在集成开发环境背后,上面的命令是否正确我也没有验证过,
只是想熟悉一下大概过程。