一、静态库的编译与使用
编译
1、新建一个静态库项目
2、将头文件和源文件添加到项目中
3、选择Debug或Release以及Win32或x64模式
3、右击对应的项目,点击“生成”即可。如Debug,x64模式,生成的静态库在“x64\Debug”下,即“libImgProc.lib”
使用
1、新建一个测试项目
2、选择属性管理器,选择对应的模式,右击打开属性窗口
在VC++目录下,将头文件路径写入“包含目录”,静态库路径写入“库目录”。同时在链接器->输入下,将静态库名写入“附加依赖项”。
二、动态库的编译
方式一:采用模块定义(.def)文件声明
编译
1、新建一个动态库项目
2、将头文件和源文件添加到项目中
3、新建一个dllmain.cpp ,用于定义 DLL 应用程序的入口点,内容如下:
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include <windows.h>
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
【需包含库<windows.h>,里面有很多与生成动态库的相关函数和参数】
4、建立源文件Source.def:右击对应项目,添加新建项->Visual C++->代码->模块定义文件
在Source.def文件中添加内容:
LIBRARY "dllImgProc"
EXPORTS
MyImageInit @1
MyImageFree @2
ImgRGBToGray @3
ImgGrayToBina @4
ImgRGBToYUV @5
ImgInterp @6
ImgResize @7
ImgRotate @8
ImgFlip @9
ImgCrop @10
ImgFilter @11
ImgMedianFilter @12
ImgEdgePrewitt @13
ImgEdgeSobel @14
ImgEdgeCanny @15
ImgThin @16
此文件第一行引号中填你的项目名称即可,EXPORTS下面列出要生成的函数名称 格式:“名称 @序号”)
5、打开项目属性页,在链接器->输入->模块定义文件中填写”Source.def“
【没有这一步不能生成.lib文件】
6、右击对应的项目,点击“生成”即可。如Debug,x64模式,生成的动态库在“x64\Debug”下,即”dllImgProc.dll“ 和“dllImgProc.lib”
使用
1、同静态库一样填写“包含目录”、“库目录”和“附加依赖项”。
2、将.dll文件放在工程目录下。
附
目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要自己LoadLibary调入DLL文件,然后再手工GetProcAddress获得对应函数了。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。导入库和静态库的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。
一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。
参考:https://www.cnblogs.com/zqh20145320/p/6772985.html