1.首先用gcc将src文件下的c语言文件生成为编译、汇编指定的源文件,也就是.o文件(注意,如果头文件没有和c文件在一起,需要一起传入头文件的位置).
nowcoder@nowcoder:~/linux/lession06/calc$ gcc -c -fpic add.c div.c mult.c sub.c
2.使用gcc(archive)工具将.o文件打包,注意生成的文件名是lib后面的calc
nowcoder@nowcoder:~/linux/lession06/calc$ gcc -shared add.o mult.o sub.o div.o -o libcalc.so
3.将打包后的文件从calc文件里复制到library的lib下面(这里也可以不移动,移动的话后面调用需要写该文件的位置)
nowcoder@nowcoder:~/linux/lession06/calc$ cp libcalc.so ../library/lib/
4.main.c函数调用生成的动态库文件.
nowcoder@nowcoder:~/linux/lession05/library$ gcc main.c -o app -I ./include/ -L ./lib/ -l suanshu
-I ./include/ 找到main.c对应头文件的位置
-L ./lib/ 找到要调用的静态库文件的位置
-l suanshu 指定要调用的库(注意要使用名字,生成的时候是libsuanshu.a,调用的时候是suanshu)
这种调用方法和调用静态库的方式是一样的,但是程序会报错
nowcoder@nowcoder:~/linux/lession06/library$ ./main
./main: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory
我们通过 ldd (list dynamic dependencies)命令检查动态库依赖关系,如下图,我们会发现main依赖的动态库libcalc.so找不到,说明我们在运行生成的可执行程序main时并未找到动态库。
5.针对找不到动态库的问题,我们可以配置环境变量LD_LIBRARY_PATH 有以下几种配置方法:
①:将动态库文件的路径配置到环境变量LD_LIBRARY_PATH里($LD_LIBRARY_PATH:/home/nowcoder/linux/lession06/library/lib 表示LD_LIBRARY_PATH原来的文件内容加上新的内容)
nowcoder@nowcoder:~/linux/lession06/library$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nowcoder/linux/lession06/library/lib
查看LD_LIBRARY_PATH文件内容,发现已经将我们的动态库文件路径配置进去了
再次查看main文件依赖,可以看出动态库的路径可以找到了,就可以正常的执行程序
但是这种方法在我们关闭XShell以后他的配置就会消失,只是暂时的,所以如果需要永久性的配置,需要用后面两种方法
②.用户级别的配置
我们首先查看hone目录下有个.bashrc文件
我们在.bashrc文件里面最后一行添加我们方法一中的配置方法,加入如下代码
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nowcoder/linux/lession06/library/lib
接着我们将.bashrc文件执行一下,以下两种方法都可
nowcoder@nowcoder:~$ . .bashrc
nowcoder@nowcoder:~$ source .bashrc
然后我们就可以正常的执行我们得可执行文件main
③系统级别的配置:
首先进入/etc/profile文件里面,因为需要root权限,所以加了一个sudo
nowcoder@nowcoder:~/linux/lession06/library$ sudo vim /etc/profile
在/etc/profile文件里面做和方法一同样的配置
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nowcoder/linux/lession06/library/lib
接着我们将.bashrc文件执行一下,以下两种方法都可
nowcoder@nowcoder:~$ . /etc/profile
nowcoder@nowcoder:~$ source /etc/profile
然后我们就可以正常的执行我们的可执行文件main
6.针对找不到动态库的问题,我们还可以配置/etc/ld.so.cache文件列表:
因为/etc/ld.so.cache文件里面全部是二进制代码,所以不能直接在里面配置,我们用如下的方法
nowcoder@nowcoder:~$ sudo vim /etc/ld.so.conf
进入该文件以后,我们将我们的动态库文件路径输入进去,动态库文件路径如下:
/home/nowcoder/linux/lession06/library/lib
保存以后,执行一下
nowcoder@nowcoder:~$ sudo ldconfig
然后我们就可以正常的执行我们得可执行文件main
7.针对找不到动态库的问题,我们还可以将我们的动态库文件放入/lib/或者/usr/lib目录中,但是一般不推荐这种方法,因为前两个目录里面有很多的文件,如果里面的文件和我们的动态库文件名字一样,很可能会发生错误