vc++ 动态库和导入库的区别
展开全部
静态库
1. 静态库扩展名为.lib,静态链接(即代码会直接编译进可执行文件)。静态库是一个或多个obj文件的打包。
2. 在VC中使用静态库的方法:
方法一:在项目属性中添加附加依赖项。
若库目录不在系统和当前目录,选中工程,单击右键,属性-->VC++目录,在库目录中添加库文件所在路径;
选中工程,单击右键,属性-->链接器-->输入,在"附加依赖项“右边选择编辑,输入要包含的静态库名称。
方法二:在项目中直接添加库文件。
选中工程,单击右键,添加-->现有项,在弹出的对话框中选择想要添加的静态库,点击确认。
方法三:使用pragma预处理指令。如:
[cpp] view plain copy
#pragma comment(lib, ".../lib/test.lib")
利用上述方法导入静态库后,就可在源码文件中包括.h文件,然后在源码文件中使用静态库函数。
3. 在VC中生成静态库:
选中工程,单击右键,属性-->常规,在"目标文件扩展名"后输入.lib,在"配置类型"中选择"静态库(.lib)"
动态库和导入库
1. 和静态库不同,动态库不会编译进可执行文件中,多个程序引用动态库时,内存中实际只会有一份动态库的内容。
用VC创建动态库时,实际生成两个文件,一个lib文件和一个dll文件,这个lib文件就是导入库。
导入库是动态库的辅助库,导入库中不含代码,而是为链接程序提供信息,包含在.exe文件中建立动态链接时要用到的重定位表。
导入库用于程序开发时,动态库用于程序运行时。
2. 在项目中使用动态库的方法:
方法一: 隐式加载: 这种方式和静态库的使用方法一样,对应有3种具体的方法,注意此时要包含的是导入库而不是动态库,依然需要头文件,代码中可直接使用头文件中的函数名,并且这种方式在运行时需要需要动态库。
方法二: 显式加载(又称运行时动态链接):在代码中使用LoadLibrary()显式打开dll文件,使用GetProcAddress获取函数地址然后使用,使用完之后用FreeLibrary显式释放dll文件。这种方式不需要导入库及.h文件。
使用隐式加载时,如果进程在启动时未找到dll,则操作系统将终止此进程。但使用显式加载时则进程不会被终止。
3. 在VC中生成动态库和导入库:
选中工程,单击右键,属性-->常规,在"目标文件扩展名"后输入.dll,在"配置类型"中选择"动态库(.dll)"
注意: 对于要导出给外部程序使用的函数及数据,均应具有_declspec(dllexport)。如果dll源码中没有一个_declspec(dllexport),则不会生成导入库。
4. DllMain函数:
DllMain函数为dll的入口函数,该函数不是必须的。该函数在dll被加载进程地址空间时运行(即隐式加载时,在main()函数执行之前就已经运行;显式加载时,在LoadLibrary时运行)。
1. 静态库扩展名为.lib,静态链接(即代码会直接编译进可执行文件)。静态库是一个或多个obj文件的打包。
2. 在VC中使用静态库的方法:
方法一:在项目属性中添加附加依赖项。
若库目录不在系统和当前目录,选中工程,单击右键,属性-->VC++目录,在库目录中添加库文件所在路径;
选中工程,单击右键,属性-->链接器-->输入,在"附加依赖项“右边选择编辑,输入要包含的静态库名称。
方法二:在项目中直接添加库文件。
选中工程,单击右键,添加-->现有项,在弹出的对话框中选择想要添加的静态库,点击确认。
方法三:使用pragma预处理指令。如:
[cpp] view plain copy
#pragma comment(lib, ".../lib/test.lib")
利用上述方法导入静态库后,就可在源码文件中包括.h文件,然后在源码文件中使用静态库函数。
3. 在VC中生成静态库:
选中工程,单击右键,属性-->常规,在"目标文件扩展名"后输入.lib,在"配置类型"中选择"静态库(.lib)"
动态库和导入库
1. 和静态库不同,动态库不会编译进可执行文件中,多个程序引用动态库时,内存中实际只会有一份动态库的内容。
用VC创建动态库时,实际生成两个文件,一个lib文件和一个dll文件,这个lib文件就是导入库。
导入库是动态库的辅助库,导入库中不含代码,而是为链接程序提供信息,包含在.exe文件中建立动态链接时要用到的重定位表。
导入库用于程序开发时,动态库用于程序运行时。
2. 在项目中使用动态库的方法:
方法一: 隐式加载: 这种方式和静态库的使用方法一样,对应有3种具体的方法,注意此时要包含的是导入库而不是动态库,依然需要头文件,代码中可直接使用头文件中的函数名,并且这种方式在运行时需要需要动态库。
方法二: 显式加载(又称运行时动态链接):在代码中使用LoadLibrary()显式打开dll文件,使用GetProcAddress获取函数地址然后使用,使用完之后用FreeLibrary显式释放dll文件。这种方式不需要导入库及.h文件。
使用隐式加载时,如果进程在启动时未找到dll,则操作系统将终止此进程。但使用显式加载时则进程不会被终止。
3. 在VC中生成动态库和导入库:
选中工程,单击右键,属性-->常规,在"目标文件扩展名"后输入.dll,在"配置类型"中选择"动态库(.dll)"
注意: 对于要导出给外部程序使用的函数及数据,均应具有_declspec(dllexport)。如果dll源码中没有一个_declspec(dllexport),则不会生成导入库。
4. DllMain函数:
DllMain函数为dll的入口函数,该函数不是必须的。该函数在dll被加载进程地址空间时运行(即隐式加载时,在main()函数执行之前就已经运行;显式加载时,在LoadLibrary时运行)。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询