MSDN上有相应教程(http://msdn.microsoft.com/zh-cn/library/ms235636.aspx),创建DLL没有问题,但使用的时候是采用引用的方式,不是项目中常用的方式,下面给出修正的方案。
创建动态链接库 (DLL) 项目
“文件”,“新建-“项目”。
新建项目 对话框的左侧窗格中,展开 已安装,模板,Visual C++,然后选择 win32。
Win32 控制台应用程序。
4. 为项目指定名称,选择“确定”按钮。
Win32 应用程序向导 对话框的 概述 页上,选择 “下一个”
应用程序设置 页上,在 应用程序类型下,选择 dll。
完成”按钮创建项目。
向动态链接库添加文件
1. 添加头文件(如文件名为“dllTest.h”)
// dllTest.h
#ifndef dllTest__H__
#define dllTest__H__
#ifdef dllTestDLL_EXPORTS
#define dllTestDLL_API __declspec(dllexport)
#else
#define dllTestDLL_API __declspec(dllimport)
#endif
namespace dllTestSum{
dllTestDLL_API int getSum(int a, int b);
}
#endif
2. 添加源文件(dllTest.cpp)
// dllTest.cpp : 定义 DLL 应用程序的导出函数。
#include "stdafx.h"
#include "dllTest.h"
// using namespace std;
namespace dllTestSum{
int getSum(int a, int b)
{
return a + b;
}
}
3. 在文件“stdafx.h”中添加一句
#define dllTestDLL_EXPORTS
4. 生成解决方案。可看到生成了文件“dllTest.lib”和“dllTest.dll”
下面解释各个关键语句的含义:
程序定义了一个函数
int getSum(int a, int b)
并放在一个命名空间 dllTestSum 里,防止别人用库时产生命名冲突。头文件里
#ifdef dllTestDLL_EXPORTS
#define dllTestDLL_API __declspec(dllexport)
#else
#define dllTestDLL_API __declspec(dllimport)
#endif
几句的作用是:如果程序定义了dllTestDLL_EXPORTS符号,dllTestDLL_API符号就代替 __declspec(dllexport)此修饰符使它们导出为DLL,以供其他程序使用; 当dllTestDLL_EXPORTS 未定义时,dllTestDLL_API 符号就代替__declspec(dllimport)符号在代码中修饰变量、函数等,此修饰符使编译器从DLL导入它们供程序使用。 文件“stdafx.h”里
#define dllTestDLL_EXPORTS
一句,定义了dllTestDLL_EXPORTS符号,故而使得程序可将函数导出为DLL。
注意:__declspec(dllexport)和__declspec(dllimport)前都是双下划线,关于二者的详细信息,可参见MSDN(http://msdn.microsoft.com/zh-cn/library/3y1sfaz2.aspx)
创建引用 DLL 的应用程序
1. 创建一般的Win32 控制台应用程序;
2. 将DLL库的头文件“dllTest.h”包含进项目中(也可在项目属性里,“C/C++目录”-“常规”-“附加包含目录”里添加头文件所在的文件夹路径即可);
3. 在项目属性里,“链接器”-“常规”-“附加库目录”里添加“dllTest.lib”所在的文件夹路径,在“链接器”-“输入”-“附加依赖项”里添加库文件“dllTest.lib”;
4. 项目源文件代码如下:
// mydllOne.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "dllTest.h"
#include<iostream>
using namespace std;
int main(int argc, _TCHAR* argv[])
{
int a = 2;
int b = 3;
int c = dllTestSum::getSum(a,b);
cout <<"a + b = "<<c<<endl;
getchar();
return 0;
}
5. 编译生成可执行文件,将“dllTest.dll”和可执行文件放在一起,即可执行。
另外,生成dll时,可让debug的dll和release的dll名字不一样,如debug带“_d”后缀。具体操作如下:
生成dll时,在debug下,选择项目属性-“配置属性”-“常规”-“目标文件名”,改变默认的输出文件名“$(ProjectName)”,如改为“$(ProjectName)_d”,如下图:
这样,在debug下生成的lib和dll都会有_d的后缀,区别于release。
要引用dll,也方便很多,就不用对每个项目再在dubug和release下分别输入附加依赖项"**.lib"了,而可以在项目中添加这几行代码
#ifdef _DEBUG
#pragma comment(lib,"dllTest_d.lib")
#else
#pragma comment(lib,"dllTest.lib")
#endif
清楚而又方便复制。(原来不重命名debug和release的dll,用#pragma comment也行,但那样名字一样,代码不够清晰。)