Linux操作系统中,依据函数库是否被编译到程序内部,将其分为两大类,静态函数库和动态函数库。
Linux下的函数库放在/lib或/usr/lib,头文件放在/usr/include。
在既有静态库又有动态库的情况下,默认使用动态库,如果强制使用静态库则需要加-static选项支持。
关于静态库
1.拓展名通常为libxxx.a。
2.静态库在编译时会直接整合到执行程序当中,因此用静态库编译成的文件会比较大。
3.优点:用其编译成功的可执行文件可以独立执行,不需再要向外部要求读取函数库的内容。
4.缺点:因为静态库是直接整合到可执行文件中的,所以其改变时,整个可执行文件都要重新编译才能将新的函数库 整合到程序中,所以升级静态库会比较麻烦。另外就是2中提到的体积大。
5.创建:gcc -c file1.c
gcc-c file2.c
......
gcc -c filen.c
ar -rcs libname.a file1.o file2.o ... fileN.o
//ar:静态函数库创建的命令
//-c:create替换
//-r:replace。表示如果当前插入的模块名已在库中存在,则替换同名的模块;如果其中有一个模块在库 中不存在,则ar会显示一个错误信息,并不替换其他同名的模块。默认情况下,新的成员增加在库的结尾处。
关于动态库(共享库)
1.拓展名通常为libxxx.so。
2.动态函数库并未被整合到可执行文件中,而是当可执行文件要使用到函数库的机制时,程序才会去读取函数库来使 用。使用动态库的可执行文件具有指向指向动态函数库的Pointer,不包含函数库内容,因此相比之下文件较小。 尤其是在多个程序同时使用一个函数库的情况下,使用动态库可以大大减少文件的占用空间。
3.优点:由于具有指向功能,所以当动态库改变时并不影响程序(前提是函数库的文件名不变),故其升级较静态库 方便很多。
4.缺点:使用动态库编译出来的文件不可以被独立执行,且可执行文件里的Point是固定的,即程序读取动态库的路 径是一定的,所以动态库不可以随便移动或删除。
5.创建:gcc -shared -fpic -o libname.so file1.c file2.c ... fileN.c
使用
gcc file.c -L. -lname -I.
//-L指定函数库查找位置
//-l指定需要操作的库名(没有lib也没有.a)
//-I指定头文件件查找位置
当使用静态库时,直接./a.out就可以运行程序;当使用动态库时,系统会去/uer/lib中加载动态库,如果该动态库没有在这个路径下直接运行时则会报错,这是可以将库拷贝到此路径下,也可以使用环境变量LD_LLIBRARY_PATH,使其等于当前函数库对应路径以实现目的。