什么是库:一种二进制的复用,也就是,将函数或方法,变成二进制文件。
库的种类:静态库和动态库
在windows平台下静态库后缀为.lib ,在linux 下后缀名.a。
静态库在被调用时,要将头文件和.lib文件拷贝到你的工程下,静态库工作时,会把整个库到考入你的目标文件中,所以在生成可执行文件后,静态库不存在了,也没关系。在linux下也一样,在linux下,你要将你的源文件和库一起编译。
动态库是在运行是被调用;所以在编译阶段只需要库信息*.lib文件和头文件,就可以进行生成目标文件和链接,但是在执行可执行文件时,如果没有库,将无法执行。所以在执行.exe文件时,必须要有相应的库。
动态库的隐式调用:隐式调用需要,.dll库+lib信息文件+头文件,同时在调用程序中,需要,引用库#pragma comment(lib,"*.lib"); 隐式调用偏简单。
动态库的显示调用:显式调用,可以不用lib信息文件和头文件,只需要库文件,也不需要引用库,
typedef int(*fc)();
HMODULE hdll=LoadLibrary(TEXT("testdll.dll"));
if (!hdll)
{
cout << "查找失败" << endl;
}
else
{
fc f = (fc)GetProcAddress(hdll, "fntestdll");
if (f == NULL)
{
cout << "查找失败!" << endl;
}
else
cout << f << endl;
}
FreeLibrary(hdll);
需要头文件windows.h,在显式调用时,如果遇到,找不到函数时,可能是,dll库中.pp文件,没有对方法进行extren "C"定义,导致,方法按照c++重载的方式,将函数名更改了,导致你找不到函数。
静态库的调用和动态库的隐式调用基本相同。
静态库和动态库的对比:静态库编译之后可以不用再带着静态库,但是,可执行文件会比较大,浪费空间,动态库在使用必须带着,但是动态库可以被共享调用,节省空间,并且,修改,更容易实现。可以只替换动态库。必要时,要替换头文件。
动态库隐式调用和显式调用的对比:隐式调用简单,但是,一旦,某个库缺失或出错,会导致整个应用程序的不能使用。显示调用稍,麻烦,但是,在某个库缺失时,可以进行判断,不妨碍其他函数的运行,可以实现局部更新升级,有更好的使用性。