一、介绍
1、静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。
2、动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。Windows下动态库为.dll后缀,在linux下为.so后缀。
二、零星知识点汇总
1、尖括号代表标准头文件
如果在#include语句中使用尖括号,编译器就会在标准头文件目录中查找头文件,而不是当前目录。为了用本地头文件编译程序,需要把尖括号换成双引号"";
2、标准头文件目录在哪?
如果头文件用尖括号包含的,类Unix系统下,编译器会在/usr/local/include 和 /usr/include 下查找。如果是windows系统,用的是MinGW版本的gcc,编译器会先在 c:\MinGW\include中查找,然后是其他路径。注:/usr/local/include通常存放第三方库,编译器会优先查找,/usr/include一般用来放操作系统的头文件。
3、静态库
libXXX.a是静态库命名的标准方式。
4、动态库
Windows中,动态库通常叫做动态链接库,后缀名是.dll;在Linux和Unix中,它们叫共享目标文件,后缀名.so;而在Mac上,它们就叫动态库,后缀名.dylib。后缀名不同,但是创建它们的方法相同。
5、动态库的连接
以下面的命令创建elliptical程序:gcc -I/include -c elliptical.c -o elliptical.o
gcc elliptical.o -L/libs -lhfcal -o elliptical
因为库是动态的,所以编译器不会在可执行文件中包含库代码,而是插入一段用来查找库的“占位符”,并在运行时链接库。
现在动态库hfcal放在/libs下,不在标准路径中。
(1)Mac
可以直接运行程序。在Mac中编译程序,文件的完整路径/libs/libhfcal.dylib保存在可执行文件中,程序启动时知道去哪里找它。
(2)Linux
在Linux和大部分Unix中,编译器只会记录libhfcal.so库的文件名,而不包含路径名。也就是说如果不把hfcal库保存到标准目录(如/usr/lib),程序就找不到它。程序找不到时,linux会检查保存在LD_LIBRARY_PATH变量中的附加目录。只要把库目录添加到LD_LIBRARY_PATH中,并export它,elliptical就能找到libhfcal.so。
(3)windows
用Cygwin和MinGW版gcc编译的代码,两种编译器都会创建windows下的dll库与可执行文件。同linux一样,Windows可执行文件也只保存hfcal库的名字,不保存目录名。windows程序会先在当前目录下查找,如果没找到就去找保存在PATH变量中的目录。
小结:
上述说明了动态库的使用需要考虑程序的编译和执行分别是怎样链接动态库的。为了省事,一般程序员采取这样的策咯。在Linux和Mac中,动态库通常保存在/usr/lib和/usr/local/lib中;而在windows中,.dll文件和执行文件通常保存在同一个目录中。
致谢
3、《嗨翻C》