动态链接库DLL导出相关问题

2014年4月5日 由 Creater 留言 »

导出声明

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

  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");

}
广告位

评论已关闭.