扫盲:
1. lib是静态库,编译时直接加载,dll是动态库,运行时才加载
2. lib简单粗暴,dll精巧灵活
3. lib大,dll小
4. lib工程的输出有两样:xxx.h/xxx.lib
5. dll工程的输出有三样: xxx.h/xxx.lib/xxx.dll(此处xxx.lib和lib工程编译的xxx.lib性质不同)
6. 使用lib编译的exe大,可以单独发布;使用dll编译的exe小,dll要同步发布
此处只给出个人的使用感受,详细扫盲请参阅参考链接1
库的生成:
1. 无论是生成lib还是dll,创建项目时请选择“空工程”
2. 无论想生成lib还是dll,创建项目时请按需求选择创建dll还是lib(创建工程选错了也没关系,只要确保“工程属性->属性配置->常规->项目默认值->配置类型=静态库(.lib)或者动态库(.dll)即可)
3. lib生成不需要做任何修改,直接可生成
4. dll生成比lib多一步,在API的头文件上对欲导出的函数或者变量进行export声明,方法有两种(标准解决方案):
a) #define API_DECLEARE __declspec(dllexport)
然后再利用“API_DECLEARE”对目标函数进行声明即可(把这个宏想象成extern)
例如:
int add(int, int);
改为:API_DECLARE int add(int, int);
class cExample
{
public:
...
}
改为:
class API_DECLARE cExample
{
public:
...
}
b) 建立模块定义文件来统一管理(module.def)
然后
LIBRARY "DLLGenerator"
EXPORTS
Add @1
Mul @2
如上所示声明即可
库的使用:
开始使用前请检查xxx.h/xxx.lib/xxx.dll(静态调用不需要)已经准备好了
无论是lib还是dll,都需要按照如下进行配置
1. 准备好头文件和模块。
2. 配置头文件和lib文件的路径
a) 如果把头文件和lib文件都拷贝到和main平级的文件夹下,则不用手动配置路径
b) 如果不是,请依次配置:
i. 头文件路径配置:属性->配置属性->C/C++->常规->附加包含目录
ii. lib文件路径配置:属性->配置属性->链接器->常规->附加库目录
3. 将lib添加到“附加依赖项”,使得lib发挥作用,方法为:
a) 属性->配置属性->链接器->输入->附加依赖项:把xxx.lib的名字写上
如果使用dll,还需进行一项配置
4. 把xxx.dll拷贝到程序执行目录下(和xxx.exe放到一起)
参考链接:
1. lib和dll的区别和联系:
https://blog.csdn.net/ghevinn/article/details/43759655
2. 微软提供的原版DLL创建和使用工程示例(亲测可行,但是DLL的引用如果不在同一个解决方案内则不行)
https://msdn.microsoft.com/zh-cn/library/ms235636.aspx
3. 关于dllexport的微软的官方解释:
https://msdn.microsoft.com/zh-cn/library/3y1sfaz2.aspx
4. 关于DLL引用CSDN上的参考解决方案:
https://blog.csdn.net/stl1634614466/article/details/68061788
5. C的dll生成方法:
http://www.360doc.com/content/17/0324/14/18635950_639747726.shtml
http://www.jb51.net/article/127920.htm