• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    5年前 (2014-04-05)  C++ 评论关闭  21 
    文章评分 0 次,平均分 0.0

    导出声明

    导出声明有如下两种方式:

    1. 使用模块定义文件(*.def),大概的格式如下
      LIBRARY "dllname"
      DESCRIPTION "my test DLL"
      EXPORTS
      func @1  
      ;@1表示这是第一个导出函数

      详细可以了解下:百度百科'模块定义文件'

    2. 使用__declspec(dllexport)
      这里更多的是想说说这种方式,这种方式有几个注意点,容易造成链接错误。先来看看结构:
      文件1,myDLL.h: 

      #pragma once
      #ifndef MYDLL_H
      #define MYDLL_H
      
      #include <iostream>
      
      #ifdef DLL_IMPLEMENT
              #define DLL_API __declspec(dllexport)
      #else
              #define DLL_API __declspec(dllimport)
      #endif
      
      #undef DLL_IMPLEMENT
      #endif

      文件2:myDLL.cpp:

      #include "stdafx.h"
      #define DLL_IMPLEMENT 
      
      #include "myDLL.h"

      由文件1的头文件,文件2的源文件,就可以生成.lib与.dll了。

      再来看看文件3:myDLLTest.cpp。
      该文件即使用这个dll的客户,另外在使用dll前还需要配置。

      include "stdafx.h"
      #include "myDLL.h"
      #include <iostream>
      using namespace std;
      
      #pragma comment(lib, "..\\Debug\\myDLL.lib")
      
      int main(){}

      至此,把dll从实现到使用的基本框架了解了。
      需要注意的是:头文件myDLL.h中,不能定义宏#define DLL_IMPLEMENT ,而应该定义在源文件中,这也是关键点所在,不然后面使用dll会链接出错。因为是dllexport还是dllimport就靠这个DLL_IMPLEMENT控制,在DLL应该是导出dllexport,在客户代码中应该是导入dllimport。

    各种导出举例

    以下是一个含有全局变量,普通函数,类,宏等结构或变量的导出示例。

    1.myDLL.h

    #pragma once
    #ifndef MYDLL_H
    #define MYDLL_H
    
    #include <iostream>
    
    #ifdef DLL_IMPLEMENT
            #define DLL_API __declspec(dllexport)
    #else
            #define DLL_API __declspec(dllimport)
    #endif
    
    #define PI 3.1415926
    
    DLL_API int myAdd(int a, int b);
    
    extern DLL_API int  myData;
    
     class DLL_API ClassTest
    {
    public:
            ClassTest(){publicData = 999;}
            void printInfo();
            int publicData;
    };
    #undef DLL_IMPLEMENT
    #endif

    myDLL.cpp

    // myDLL.cpp : 定义 DLL 应用程序的导出函数。
    //
    #include "stdafx.h"
    #define DLL_IMPLEMENT 
    
    #include "myDLL.h"
    int myAdd(int a, int b)
    {
            return a+b;
    }
    int myData = 111111111;
    void ClassTest::printInfo()
    {
            std::cout<<"Class test!"<<std::endl;
    }

    myTest.cpp

    // myDLLTest.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "myDLL.h"
    #include <iostream>
    using namespace std;
    
    #pragma comment(lib, "..\\Debug\\myDLL.lib")
    
    int main()
    {
            /**普通函数测试*/
            cout<<myAdd(5,4)<<endl;
    
            cout<<myData<<endl;
            myData = 22222;
            cout<<myData<<endl;
            //宏测试
            cout<<PI<<endl;
    
            /**类测试*/
            ClassTest test;
            test.printInfo();
            cout<<test.publicData<<endl;
            system("pause");
    
    }
     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/3217.html

    关于
    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享