IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> DLL和LIB编译以及问题 -> 正文阅读

[开发工具]DLL和LIB编译以及问题

引流

? ? ? ? 运行时库错误、libcmt已定义、msvcrt已定义、LINK2005、无法找到符号

一、动态库DLL提供

????????1、新建一个项目(任意项目,无论是控制台也好,空项目也罢)。

????????2、项目属性-》常规-》项目默认值 设置为动态库。

????????3、新增一个头文件,名字自定。写入如下方声明。以GetImphash 函数为例的一个声明。

????????4、添加新建项-》代码-》模块定义文件(.def)写入库隐式链接名和函数名。

????????5、设置属性-》连接器-》输入-》模块定义文件设置刚才的def文件(一般会自动设置)。

????????6、增加cpp文件,包含3中头文件并实现该方法即可。

//.h文件声明导出函数,也用于导入时链接lib
#ifdef __cplusplus
extern "C" {
#endif 

#ifdef EXPORTDESC //在库项目属性-》c++-》预处理器-》预处理器定义加入EXPORTDESC 即可
#define DLL_EXPORT __declspec(dllimport)
#else
#define DLL_EXPORT _declspec(dllexport)
#endif

	//保证缓冲区大于33字节
	DLL_EXPORT int GetImphash(char* FileName, char* HH);

#ifdef __cplusplus
}
#endif
;def文件
LIBRARY yara_imphash_33;指定模块名
EXPORTS
GetImphash @1;导出函数名字 和序号,此处可以确保名字不带参数

二、静态库编译

? ? ? ? 一般而言,能将代码编译为静态库同样也能编译为静态库。只需将?项目属性-》常规-》项目默认值 设置为静态库,所以编译静态库先完成上述动态库设置。

? ? ? ? ①如果原来在dll中存在依赖项(属性-》连接器-》输入-》附加依赖项),这里的依赖项的所在目录一般在此指定:属性-》连接器-》常规-》附加库目录 。此时编译lib也需要将依赖加入到lib的配置中。

? ? ? ? ②务必注意,设置为dll和lib时其设置不共通,需要手动设置涉及的目录。操作为首先设置 属性-》常规-》项目默认值-》配置类型 更改为lib,此时属性页不会改变,需要点击确定或应用后属性页才会刷新。

? ? ? ? ③在②? 设置后 即可对应①中的配置进行设置。附加依赖项在:属性页-》库管理器-》常规-》附加依赖项? ,而附加库目录在: 属性页-》库管理器-》常规-》附加库目录。将dll时的设置同样添加到这里

? ? ? ? ④由于之前dll的头文件是用于声明导出的,在编译为静态库后则不再需要,因此在使用项目时需要去掉export的声明。

知识点汇总

? ? ? ? 1、头文件声明使用宏实现在库项目和使用者项目函数的导入和导出的声明。即在库项目中export声明生效。在使用库的项目中import宏生效。

? ? ? ? 2、def文件可以使导出函数名不附带参数与返回值的符号说明,干净易用

? ? ? ? 3、dll动态库生成时同样会生成lib 文件,此时lib作用仅仅是隐式链接(很多缺少dll弹框则隐式链接,代码调用loadlibray自行编写则为显示)。

? ? ? ? 4、库编译为lib时,如dll依赖A.lib和 B.lib。则lib依然依赖他们,在编译后的目标lib中将包含A.lib和 B.lib的代码,之后的使用者只链接改库lib无需再链接A.lib和 B.lib。

? ? ? ? 5、无论编译为LIB还是DLL,其运行时库尽量统一,这在编译为LIB或者程序兼容方面有莫大的帮助。运行时库的查看选择:属性-》c++-》代码生成-》运行库。对应关系为

运行时对应库是否静态优缺点
MT/MTDlicmt.lib静态(编译后不引入运行时dll)程序大,跨模块堆隔离
MD/MDdmsvcrt.lib动态(依赖于msvcrxxx.dll)程序小,需要使用者安装VC运行时库

? ? ? ?如果在程序中引入上述的 md系列运行时库,那在使用者未安装vc运行库时则无法正常运行,出现类似如下的错误 。

? ? ? ? 6、从上述中可以发现,如果我们混用mt md且先不谈他们会出现符号重定义问题,而且也会集合两个的缺点,让程序变得混乱,既是增加了依赖还让程序臃肿不堪。因此尽量保证一个dll或lib的运行时和他的所有依赖项都一致。

? ? ? ? 7、最后的编译时的平台工具集或SDK版本不同会导致链接错误,因此需要在相同的平台工具集和SDK版本下编译。有的平台工具集无法选择SDK(较老的如vs 2010工具集)

? ? ? ? 8、使用LIB有时候死活无法解析外部符号,可以注意看函数声明的头文件关于 import字段的声明宏处理,有的需要在使用者的预编译定义加入一些宏。保证使用静态lib时候的声明无import字样。

? ? ? ? 9、接上条,出现死活识别不了的可能是未定义 def或者 def中声明不正确。

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-05-21 19:11:00  更:2022-05-21 19:12:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年9日历 -2024/9/21 11:23:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码