VS2015 C++生成动态链接库(包括模板函数与类)

有一个项目需要把一个类用链接库的方式调用,而类的成员函数调用了一个模板函数。

一、生成

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;
}

以上的例子比较简单,可能没有什么意义,只是纯粹的为了记录方法。

猜你喜欢

转载自blog.csdn.net/xitie8523/article/details/84863342
今日推荐