lib 和 dll 文件的区别和联系
.dll 是在你的程序运行的时候才连接的文件,因此它是一种比较小的可执行文件格式,.dll还有其他的文件格式如.ocx等,所有的.dll文件都是可执行。
.lib 是在你的程序编译连接的时候就连接的文件,因此你必须告知编译器连接的lib文件在那里。一般来说,与动态连接文件相对比,lib文件也被称为是静态连接库。当你把代码编译成这几种格式的文件时,在以后他们就不可能再被更改。如果你想使用 lib 文件,就必须:
- 包含一个对应的头文件告知编译器lib文件里面的具体内容
- 设置lib文件允许编译器去查找已经编译好的二进制代码
如果你想从你的代码分离一个 dll 文件出来代替静态连接库,仍然需要一个 lib 文件。这个 lib 文件将被连接到程序告诉操作系统在运行的时候你想用到什么 dll 文件,一般情况下,lib 文件里有相应的 dll 文件的名字和一个指明 dll 输出函数入口的顺序表。如果不想用 lib 文件或者是没有 lib 文件,可以用 WIN32 API 函数 LoadLibrary、GetProcAddress。事实上,我们可以在 Visual C++ IDE 中以二进制形式打开 lib 文件,大多情况下会看到 ASCII 码格式的 C++ 函数或一些重载操作的函数名字。
一般我们最主要的关于 lib 文件的麻烦就是出现 unresolved symble 这类错误,这就是 lib 文件连接错误或者没有包含 .c、.cpp 文件到工程里,关键是如果在 C++ 工程里用了 C 语言写的lib文件,就必需要这样包含:
extern "C"
{
#include "myheader.h"
}
这是因为 C 语言写的 lib 文件没有 C++ 所必须的名字破坏,C 函数不能被重载,因此连接器会出错
C 语言中有一些函数不需要进行编译,有一些函数也可以在多个文件中使用。一般来说,这些函数都会执行一些标准任务,如数据库输入/输出操作或屏幕控制等。可以事先对这些函数进行编译,然后将它们放置在一些特殊的目标代码文件中,这些目标代码文件就称为库。库文件中的函数可以通过连接程序与应用程序进行连接。这样就不必在每次开发程序时都对这些通用的函数进行编译了。
不同类型的应用程序将会使用不同的函数库。例如:libdbm 库中组包含了对数据库文件进行访问的 dbm 函数,需要对数据库进行操作的程序就会与该库进行连接。数学应用程序将使用数学库 libm,X-Windows 应用程序将使用 Xlib 库,libX11。另外,所有的程序都将使用标准的 C 函数库。libc,该库中包含了诸好内存管理或输入输出操作的基本函数,这些库都存放在 /usr/lib 这些系统公用的目录中,系统中的任何用户都可以利用这些库。当然用户也可以建立自己专用的库函数,供自己或其它指定的人员使用。
库可以有三种使用的形式:静态、共享和动态。静态库的代码在编译时就已连接到开发人员开发的应用程序中,而共享库只是在程序开始运行时才载入,在编译时,只是简单地指定需要使用的库函数。动态库则是共享库的另一种变化形式。动态库也是在程序运行时载入,但与共享库不同的是,使用的库函数不是在程序运行开始,而是在程序中的语句需要使用该函数时才载入。动态库可以在程序运行期间释放动态库所占用的内存,腾出空间供其它程序使用。由于共享库和动态库并没有在程序中包括库函数的内容,只是包含了对库函数的引用,因此代码的规模比较小。