动静态库的制作与使用(Linux操作系统)
一、静态库制作
首先准备好需要做成库的源文件与头文件,如下示例:
注意:在制作库方法过程中不能有main函数。
如果代码是用c语言进行写的,执行以下语句把所有.c文件进行编译得到了.o文件。
gcc -c *.c
使用ar指令把所有.o文件链接成静态库,如下:
ar -rc libmyc.a *.o
-
-r(replace):此选项表示在插入文件到库时,若遇到同名的成员,则进行替换。它确保了库中的文件是最新的。
-
-c
(create):这个选项用于创建一个新的库文件。如果指定的库文件已经存在,它并不会被覆盖,而是会报错提示文件已存在。
注意:在静态库命名时开头必须是lib,结尾必须是 .a 中间的才是它真正的名字,比如这里的myc。
这样动态库就制作完了,即libmyc.a。
二、动态库制作
源文件头文件不变,在生成静态库之后.o文件就没有用了我们把删除(rm *.o),以免干扰下面操作,重新生成.o文件并带-fPIC选项:
gcc -c -fPIC *.c
fPIC:产⽣位置⽆关码(position independent code),这里先不做过多追究。
gcc提供了制作动态库的选项:-shared,如下生成动态库:
gcc -shared *.o -o libmyc.so
注意:在动态库命名时开头必须是lib,结尾必须是 .so 中间的才是它真正的名字,比如这里的myc。
三、动静态库打包
我们把库和头文件分别装入一个相同的新建目录,例如这里新建立mylib1和mylib2,然后分别创建include拿来放头文件,创建lib拿来放库文件。结构如下:
使用tar指令打包。
tar czf mylib1.tgz mylib1
tar czf mylib2.tgz mylib2
然后得到mylib1.tgz(静态库),mylib2.tgz(动态库),就可以把它们分享给好朋友使用了。
四、静态库使用
我们创建一个zhangsan目录模拟我们的好朋友张三,并把打包好的库给他,如下:
然后进行解包,如下指令:
tar xzf mylib1.tgz
tar xzf mylib2.tgz
然后我们生成可执行文件时需要带以下选项,才能让系统找到库:
-I:指定头⽂件搜索路径
-L:指定库路径
-l:指定库名
gcc -o exe code.c -I ./mylib1/include -L ./mylib1/lib -l myc
以上写法未免也太麻烦,我们能不能让系统自己去找到它们呢?当然可以,只需要我们把头文件放到/usr/include下,把静态库放在/lib64下,就能被系统的默认路径找到,如下:
sudo cp ./mylib1/include/* /usr/include
sudo cp ./mylib1/lib/* /lib64
gcc -o exe code.c -l myc
我们在生成可执行文件时,-l选项依然不能忘记,因为虽然gcc认识c语言库,但我们自己写的库它并不认识。
五、动态库使用
我们用同样的方法,使用动态库生成可执行文件。
gcc -o exe code.c -I ./mylib2/include -L ./mylib2/lib -l myc
但我们可以尝试一下,exe其实并不能运行,因为它在运行时又找不到动态库了。
这是因为静态库在与我们写的程序进行链接生成可执行文件后就与程序绑定到一起了,也就是说它成为了程序的一部分了。而动态库需要在可执行文件开始执行后才开始加载。
我们可以使用以下四种方法让系统找到动态库:
- 拷⻉ .so ⽂件到系统共享库路径下,⼀般指 /usr/lib、/usr/local/lib、/lib64等。
- 向系统共享库路径下建⽴同名软连接。
- 更改环境变量: LD_LIBRARY_PATH。
- ldconfig⽅案:配置/ etc/ld.so.conf.d/ ,ldconfig更新。