库:从本质来说是一种可执行的二进制代码,与具体的硬件平台有关系。静态库与动态库(它们从被载入内在的时间不同)静态库:它是在编译时(具体是在连接时)把库中的相关代码复制到程序中去。优点:程序运行时不需要库缺点:程序的体积偏大,库的升级不方便。生成步骤:(相同目录下有hello.c hello.h(自定义的头文件),test.c(测试程序当中有其它函数))1,gcc -c hello.c(hello.c当中并没有main()只是其它函数的实现。)2,ar crs -o libhello.a hello.o(生成静态库)libhello.a是库文件名,hello是库名,这两者的区分很重要。3,gcc -o test test.c -lhello(-l后面接的是库名) -L.(-L后面接的当前路径)平常我们编译的代码不需要加入库名与库路径 是 gcc 默认加入了-lc ,而c库以在默认路径下,故而不需要在加入路径了。注意点:1,默认的头文件在/include,/usr/include2, 默认的库在/lib,/usr/lib3, 默认的加载路径/lib,/usr/lib如果所需要的文件都在默认的路径下,那么我们就不需要接(-lhello和-L.)了。还有一点就是-lhello和-L.只能写在后面。动态库:它是在编译时(具体是在连接时)只保留了函数的入口地址,不复制相关的代码。只有在运行时才把相关代码载入(所以我们还需要一个加载路径)。优点:节省空间。升级方便缺点:程序的执行效率低程序执行时需要加载库。生成步骤:(相同目录下有hello.c hello.h(自定义的头文件),test.c(测试程序当中有其它函数))1,gcc -fPIC -Wall -c hello.c(hello.c当中并没有main()只是其它函数的实现。)2,gcc -shared -o libhello.so.1 hello.o3, ln -s libhello.so.1 libhello.so (生成link文件,以便于升级的方便)4,gcc -o test test.c -lhello(-l后面接的是库名) -L.(-L后面接的当前路径)注意点同上,但是运行程序的时候还不能够运行,就是加载路径问题引起的。有三种方法可以解决:1,把库放在/lib或/usr/lib下2,添加新的加载路径 export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:./3,新建并编辑/etc/ld.so.conf.d/*.conf,把库所在路径添加进去,最后需要执行ldconfig。
静态库与动态库的区别
最新推荐文章于 2024-07-28 17:09:25 发布