Visual Stdio 动态库的生成
来源:互联网 发布:ie浏览器无法登录淘宝 编辑:程序博客网 时间:2024/05/23 19:16
VS 下面生成动态库时,只需要在项目向导中最后一步选择是生成dll文件或者在创建项目后在项目->属性中设置生成的属性为dll。
关键是如何使用生成的dll。VS在生成dll时默认是不生成对应的导入库lib的。需要自己定义需要导入的函数。文件类型为.def。
.def的添加方式为项目属性-->连接器-->输入-->模块定义文件,输入source.def。
MSDN上的介绍
网上的资料:
1.DLL声明导出函数
DLL中导出函数的声明有两种方式:一种为在函数声明中加上__declspec(dllexport);另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。
1)函数声明方式
#ifndef LIB_H#define LIB_Hextern "C" int _declspec(dllexport) add(int x,int y);#endif
函数实现
#include "add.h"int add(int a, int b){return a + b;}
在另一个项目中引用项刚才生成的dll.当动态调用时,不需要加入函数头,因为是有编译器去dll可执行文件的符号表里面找有没有对应的函数。此时奇怪的是要用LoadLibraryA,可以找到,但是用LoadLibrary却返回是NULL,不知道是问什么?还有就是windows下编程是文件路径可以用两种方式:
1. F:/VS 2010 Projects/dll1/main/Debug/dll1.dll
2. F:\\VS 2010 Projects\\dll1\\main\\Debug\\dll1.dll但是不支持单独使用 \ 来分割路径,因为 \ 被处理时认为是转义字符。
#include <stdio.h>#include <windows.h>typedef int(*addfunc)(int, int);int main(){HINSTANCE hdll;addfunc add;hdll = LoadLibraryA("F:\VS 2010 Projects\dll1\main\Debug\dll1.dll");if (hdll != NULL){add = (addfunc)GetProcAddress(hdll, "add");if (add == NULL){printf("can not find the function\n");}else{int res = add(1, 2);printf("the ans is %d", res);}FreeLibrary(hdll);}return 0;}DLL的动态调用
由“LoadLibrary-GetProcAddress-FreeLibrary”系统Api提供的三位一体“DLL加载-DLL函数地址获取-DLL释放”方式.动态调用方式的特点是完全由编程者用 API 函数加载和卸载 DLL,程序员可以决定 DLL 文件何时加载或不加载,显式链接在运行时决定加载哪个 DLL 文件。动态调用方式相比静态调用,较复杂,但能更加有效地使用内存,是编制大型应用程序的重要方式。(可以手动的释放加载到内存的动态库,提高内存利用率)
2)def方式
LIBRARY dll1EXPORTSadd
函数声明,声明为外部函数。
#ifndef ADD_H#define ADD_Hextern "C" int add(int x, int y);#endif
静态方式加载动态库。
#include <stdio.h>#include "../dll1/add.h"#pragma comment(lib,"..\\Debug\\dll1.lib")int main(){int res = add(1, 2);printf("the ans is %d", res);return 0;}
静态调用采用#pragma comment(lib,"..\\Debug\\dll1.lib")方式导入。
静态调用方式的特点是由编译系统完成对DLL的加载和应用程序结束时 DLL 的卸载。当调用某DLL的应用程序结束时,若系统中还有其它程序使用该 DLL,则Windows对DLL的应用记录减1,直到所有使用该DLL的程序都结束时才释放它。静态调用方式简单实用,但不如动态调用方式灵活。
静态调用方式不再需要使用系统API来加载、卸载DLL以及获取DLL中导出函数的地址。这是因为,当程序员通过静态链接方式编译生成应用程序时,应用程序中调用的与.lib文件中导出符号相匹配的函数符号将进入到生成的EXE 文件中,.lib文件中所包含的与之对应的DLL文件的文件名也被编译器存储在 EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows将根据这些信息发现并加载DLL,然后通过符号名实现对DLL 函数的动态链接。这样,EXE将能直接通过函数名调用DLL的输出函数,就象调用程序内部的其他函数一样。
0 0
- Visual Stdio 动态库的生成
- Visual Stdio 2008 的卸载
- Visual Stdio 的的常用快捷键
- visual studio生成自己的动态静态链接库
- visual stdio 2010中$(IncludePath)的修改
- Visual Stdio的中的dll和lib
- Visual Stdio的中的dll和lib
- visual stdio 2010 打不开的原因
- Visual stdio的工程文件说明
- visual stdio缺少gdi32的解决办法
- visual stdio 安装OpenGL库文件
- Visual Stdio IDE 与 Visual Stdio Code
- Visual Stdio.NET快捷键
- visual stdio 快捷键
- Visual Stdio.NET快捷键
- Visual Stdio 常用快捷键
- Visual Stdio中的断点
- 彻底删除visual stdio
- Android中获取电池电量
- 习近平出席核安全峰会并访欧盟总部
- Xshell终端ssh连接ubuntu中文版编译服务器显示中文字符乱码
- mac connect linux
- php 函数urlencode运用解决导出中文文件名乱码
- Visual Stdio 动态库的生成
- 程序员如何在“小公司成长”和“大公司学习”
- struts1 配置文件扩展
- SIFT特征提取分析
- 用正则表达式将文字转换成表情图片
- java环境变量设置 --- 小笔记
- ActionScript 不断放大的圆
- 单例模式及c++实现
- 机器学习一张图