注意我们这里主要讨论在linux环境下的区别
我们大家都知道函数的库分为两种一个是静态库另一个是动态库
库文件:
静态库 共享库(动态库)
半成品 零件半成品
Linux .a .so
Windows .lib .dll/.DLL
使用时机 链接过程 运行过程(将动态库加载到磁盘中单独执行)
链接过程 将库里的东西打包到了库文件,一旦生产静态库可以没有
他们两的主要区别是在使用的时机不同:
在动态库只是链接了地址一个符号, 静态库在链接是就进行了打包。
链接的过程再去寻找单独去加载内存中。
.o也是二进制文件的集合,相当于一个包是静态中生成的编译文件,只是查看了语法什么的错误是.c的中间文件
动态库是通过gcc生成不可单独执行的可执行文件,如果其它文件调用可以单独执行
静态库的优缺点:
优点:他编译后执行不需要外部的函数库支持,因为所有的函数都已经被编译进去了。
缺点:如果库函数改变,那就得重新编译。
动态库的优缺点:
优点:动态函数库所产生的可执行文件比较小,动态库的改变不会影响到你的程序,所以在升级会比较方便。
缺点:因为库函数没有整合进你的程序,而是程序运行时动态的申请调用,所以程序的运行环境中必须提供相应的库。
下来我们一起看看如何配置静态库与动态库
生成静态库:
gcc -c *.c --> *.o
ar crv libxxx.a *.o-->libxxx.a
gcc -o main main.c -L(path) -lxxx xxx是名称 path是路径
取绝对路径用=$(pwd)
生成动态库:
gcc -shared -fPIC -o libxxx.so *.c 除了main.c
gcc -o main main.c -L. -lxxx
修改环境变量LD_LIBRARY_PATH: export LD_LIBRARY_PATH=最好是绝对路径
2.将生成的动态库拷贝到默认加载路径下: /lib /user/lib