有一个项目需要把一个类用链接库的方式调用,而类的成员函数调用了一个模板函数。
一、生成
1、新建控制台程序,类型选择Dll,勾选导出符号会比较省事。
刚新建的项目中classdll.h和classdll.cpp如下图,可以看出基本的格式。
2、编写.h和.cpp文件,按照自动生成的格式写我们自己的类。大致如下
ClassDll.h
// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 CLASSDLL_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// CLASSDLL_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef CLASSDLL_EXPORTS
#define CLASSDLL_API __declspec(dllexport)
#else
#define CLASSDLL_API __declspec(dllimport)
#endif
// 此类是从 ClassDll.dll 导出的
//class CLASSDLL_API CClassDll {
//public:
// CClassDll(void);
// // TODO: 在此添加您的方法。
//};
//
//extern CLASSDLL_API int nClassDll;
//
//CLASSDLL_API int fnClassDll(void);
//示例的模板函数,前面是你写的模板函数,在函数结束括号之后声明不同类型的函数
template<class T> T getSum(T a, T b)
{
return a + b;
}
template CLASSDLL_API int getSum(int a, int b);
template CLASSDLL_API double getSum(double a, double b);
template CLASSDLL_API unsigned getSum(unsigned a, unsigned b);
//示例的类,只要在你写的类名前面加上CLASSDLL_API(也就是__declspec(dllexport))就好了
class CLASSDLL_API TestClass
{
public:
TestClass(int _a, int _b) { a = _a; b = _b; }
int getSum();
private:
int a;
int b;
};
DLL 中想要导出一个函数,必须要生成这个函数的实体。而普通的函数模板在实例化之前是没有实体的,我们需要人为的实例化它。
ClassDll.cpp
// ClassDll.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "ClassDll.h"
#define CLASSDLL_EXPORTS
//// 这是导出变量的一个示例
//CLASSDLL_API int nClassDll=0;
//
//// 这是导出函数的一个示例。
//CLASSDLL_API int fnClassDll(void)
//{
// return 42;
//}
//
//// 这是已导出类的构造函数。
//// 有关类定义的信息,请参阅 ClassDll.h
//CClassDll::CClassDll()
//{
// return;
//}
//类的成员函数直接和平常一样写就可以了
int TestClass::getSum()
{
return a + b;
}
生成解决方案后可以得到
二、调用
1、新建控制台程序TestDll
2、将dll,lib,.h文件放入TestDll的目录中
3、包含头文件,隐式调用
// TestDll.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
#include"ClassDll.h"
#pragma comment(lib,"ClassDll.lib")
int main()
{
//类
TestClass cls(100, 20);
cout << cls.getSum() << endl;
//模板函数
cout << getSum(10, 20) << " " << getSum(20.1, 30.4) << endl;
return 0;
}
以上的例子比较简单,可能没有什么意义,只是纯粹的为了记录方法。