制作静态库
1、生成目标文件
gcc -c -o file.o file.c
2、静态库创建命令 ar
-c:creat
-r:replace 表示如果libfile.a已经存在file.o则覆盖
ar -cr libfile.a file.o
3实例:连接静态库
-L:指定静态函数库的位置查找,其中-L.中的"."是指当前静态函数库所在本目录之下查找
-l(小写的L):指定静态函数库名,由于静态函数库的名字命名方式是lib×××.a,其中的前缀lib和后缀.a一定要省略,不然会报错,本人在Ubuntu16.04下试过。
gcc -o main main.c -L. -lfile
如果想从别处得到一个静态库libunknown.a,想知道其中包含那些模块,命令如下:
ar -t libunknown.a
比如你想知道上诉中提到的libfile.a静态库包含什么模块命令操作如下,命令执行后会显示模块有file.o
ar -t libfile.a
//////////////////////////////////////////////////
制作动态库
1、生成目标文件
gcc -c -o file.o file.c
2、生成动态库命令
-shared: 生成共享库
-fpic: 产生动态库位置与代码位置无关
-shared:生成共享目标文件,通常用在建立共享库。
-share:此选项尽量的使用动态库,所以生成文件比较小,但是必须是系统有动态库。(系统默认使用动态库)
gcc -shared -fpic -o libfile.so file.o
3、连接动态库实例
gcc -o main main.c -L. -lfile
4、在生成main可执行文件时,不能直接./maini运行文件,因为在动态链接库时,会查找/usr/bin,/bin目录下的动态函数库,此时我们生成的库没有加载进/usr/bin和/bin目录里去
第一种方法:将libfile.so放到/usr/bin或者/bin目录里去,然后在终端输入命令ldconfig
第二种方法:将libfile.so加入到环境路径去,如果你的动态库在/home/c/FileSO/,则在终端输入:export LD_LIBRARY_PATH=/home/c/FileSO/,但是关闭终端后就无效。
第三种方法:如果共享库文件安装到了/usr/local/lib(很多开源的共享库都会安装到该目录下)或其它"非/lib或/usr/lib"目录下, 那么在执行ldconfig命令前, 还要把新共享库目录加入到共享库配置文件/etc/ld.so.conf中, 如下:
# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig