1.程序的目录结构:
---include #存放.h文件
---lib #存放要生成的动态库
---src #存放.c文件,要封装成库的函数
---main.c #要实现功能的程序(用于测试动态库的接口)
2.实现方法
在src中:
gcc -fPIC -c *.c -I../include #生成.o文件
gcc -shared -o libmytest.so *.o -Iinclude #生成动态库
mv libmytest.so ../lib
注意: .o文件必须以上面的命令生成的,这样才是与位置无关的代码(由于动态库的代码不会包含在应用程序中,而是程序运行时,再给多个动态库分配地址,所以动态库的代码位置时不固定的。而在静态库中库的代码直接打包到了程序中,所以有固定的代码段)
动态库文件必须以lib开头,以.so结尾
3.使用
gcc main.c -o test -I include ./libmytest.so
或 gcc main.c -o test -Iinclude -L./lib -lmytest
4.如果发给用户时
1)ldd 程序名 #看一下是否所有的库都在lib目录下,没有的话加上
2)此时用户不能直接运行程序,因为动态库并未打包到程序中,需要由系统进行加载对应的动态库
解决办法1:(不建议用,放到系统目录,如果有相同名称的库会导致系统库误删)
sudo cp lib/libmytest.so /lib/ #将动态库放到 /lib/目录下
ldd 程序名 发现库已经加载
解决办法2:(临时解决的方法,关掉终端,再打开后,就会失效,适合临时的库或程序测试)
export LD_LIBRARY_PATH=./lib #将自定义动态库路径导入
echo $LD_LIBRARY_PATH #自定义的动态库变量,系统会优先读此路径
解决办法3:(建议用,永久设置,常用)
vim /etc/ld.so.conf #进入这个文件,把自己的库路径添加到第二行
ldconfig #更新系统的库路径,需要权限就加上sudo,需要打印加-v