zoukankan      html  css  js  c++  java
  • 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也行,但那样名字一样,代码不够清晰。)

      

  • 相关阅读:
    ArcGis面要素空间连接,取相交面积最大者 C#
    迅雷下载器无限制版_无敏感_无限速
    redhat 6.8 配置 centos6 163 的 yum 源
    apache cgi 程序: End of script output before headers
    centos php 安装 decrypt
    url传输中+转为%2B取到变空格的问题
    快速搭建自己的搜索引擎
    ffmpeg 文件推流 rtsp和rtmp
    svn 服务器操作
    edusoho迁移
  • 原文地址:https://www.cnblogs.com/rolling-stone/p/3204778.html
Copyright © 2011-2022 走看看