/usr/lib /lib:标准系统库文件
库是一组预先编译好的函数的集合,这些函数都是按照可重用的原则编写的。它们通常有一组相互关联的函数组成以
执行某项常见的任务。
默认情况下,编译器只搜索标准C语言库。仅把库文件放在标准目录中,就希望编译器能够找到它,但库文件还需要遵
循特定的命名规范,并且需要在命令行中明确指出。
.a :传统的静态函数库
也称作归档文件,我们可以很容易的创建自己的静态库,只要使用ar程序和使用gcc -c命令对函数分别进行编译。
我们应该尽可能的把函数分别保存在不同的源文件中,如果函数需要访问公共数据,可以把它们放在同一个人源文
件中,并使用在该文件中声明的静态变量
静态库的一个缺点是当你同时运行许多应用程序并且它们都使用来自同一函数库的函数时,内存中就会有同一函数
的多份副本,而且在程序文件本身也有同样的多份副本,这将消耗大量的内存和磁盘空间
.so:共享函数库
当一个程序使用共享库时,程序本身不在包含函数代码,而是引用运行时可访问的共享代码,当编译好的程序被装
载到内存中执行时,函数引用被解析并产生对共享库的调用,如果有必要共享库才会被加载到内存中。使用这种方
法,系统可以只保留共享库的一份副本供许多应用程序同时使用,并且在磁盘上也仅保留一份。而且共享库的更新
可以独立于依赖它的应用程序。
在Linux中,可以通过ldd来查看一个程序所需要的共享库。
linlin@ubuntu:~/linlin/c_code/ar_lib$ ldd program_first
linux-vdso.so.1 => (0x00007fff5d1a4000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5ef8f3c000)
/lib64/ld-linux-x86-64.so.2 (0x0000555dd281e000)
函数库通常同时以静态库和共享库两种格式存在
可以通过给出完整的库文件路径名或用-l标志来告诉编译器要搜索的库文件。
gcc -o file file.c /usr/lib/libm.a
gcc -o file file.c -lm
这两条命令都是要求编译器编译文件file.c,并将产生的程序文件命名为file,并除了搜索标准的C语言函数库外,还
搜索数学库已解决数学函数引用问题。
-lm是简写方式,本例中表示/usr/lib/libm.a,-lm的好处是如果有共享库,编译器会自动选择共享库
静态库使用:
先为函数fred bill 创建各自的源文件,然后为他们分别编译
linlin@ubuntu:~/linlin/c_code/ar_lib$ vim fred.c
linlin@ubuntu:~/linlin/c_code/ar_lib$ vim bill.c
linlin@ubuntu:~/linlin/c_code/ar_lib$ gcc -c bill.c fred.c
linlin@ubuntu:~/linlin/c_code/ar_lib$ ls
bill.c bill.o fred.c fred.o
编译一个调用bill函数的程序,首先为库文件创建一个头文件这个头文件将声明库文件里的函数
linlin@ubuntu:~/linlin/c_code/ar_lib$ vim lib_first.test.h
调用库函数bill
linlin@ubuntu:~/linlin/c_code/ar_lib$ vim program_first.test.c
先要求编译器编译显示的指定目标,再将编译好的目标模块链接
linlin@ubuntu:~/linlin/c_code/ar_lib$ gcc -c program_first.test.c
linlin@ubuntu:~/linlin/c_code/ar_lib$ gcc -o program_first program_first.test.o bill.o
linlin@ubuntu:~/linlin/c_code/ar_lib$ ./program_first
bill: we passed Hello World
创建一个库文件
linlin@ubuntu:~/linlin/c_code/ar_lib$ ar crv libfoo.a bill.o fred.o
a - bill.o
a - fred.o
linlin@ubuntu:~/linlin/c_code/ar_lib$ ls
bill.c bill.o fred.c fred.o lib_first.test.h libfoo.a program_first program_first.test.c program_first.test.o
在编译器使用的文件列表中添加该库文件来创建程序
linlin@ubuntu:~/linlin/c_code/ar_lib$ gcc -o program_first_again program_first.test.o libfoo.a
linlin@ubuntu:~/linlin/c_code/ar_lib$ ./program_first_again
bill: we passed Hello World
也可以使用—L选项访问函数库
linlin@ubuntu:~/linlin/c_code/ar_lib$ gcc -o program_first_again2 program_first.test.o -L. -lfoo
linlin@ubuntu:~/linlin/c_code/ar_lib$ ./program_first_again2
bill: we passed Hello World