VS2010中创建和使用动态链接库

MSDN上有相应教程(http://msdn.microsoft.com/zh-cn/library/ms235636.aspx),创建DLL没有问题,但使用的时候是采用引用的方式,不是项目中常用的方式,下面给出修正的方案。

创建动态链接库 (DLL) 项目

      1. 在菜单栏上,选择“文件”“新建-“项目”

      2. 在 新建项目 对话框的左侧窗格中,展开 已安装模板Visual C++,然后选择 win32

      3. 在中间窗格中,选择 Win32 控制台应用程序

      4. 为项目指定名称,选择“确定”按钮。

      5. 在 Win32 应用程序向导 对话框的 概述 页上,选择 “下一个” 按钮。

      6. 在 应用程序设置 页上,在 应用程序类型下,选择 dll

      7. 选择“完成”按钮创建项目。

向动态链接库添加文件

 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也行,但那样名字一样,代码不够清晰。)

  

原文地址:https://www.cnblogs.com/rolling-stone/p/3204778.html