库:从本质来说是一种可执行的二进制代码,与具体的硬件平台有关系。

静态库与动态库(它们从被载入内在的时间不同)

静态库:它是在编译时(具体是在连接时)把库中的相关代码复制到程序中去。

优点:程序运行时不需要库

缺点:程序的体积偏大,

           库的升级不方便。

生成步骤:(相同目录下有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/include

2, 默认的库在/lib,/usr/lib

3, 默认的加载路径/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.o

3, 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。