C++關於DLL匯出模板類和模板函式

double64發表於2024-11-08

這兩天寫了個Dll,要匯出普通類中的模板函式,稍微查了一下,沒查到具體資料。自己根據C++模板的編譯原理,推斷出應該要原始碼放在標頭檔案中直接匯出,查了下接觸的Open Source專案,確實如此。這裡記錄一下,方便下次查閱。

1、宏定義說明:

#ifdef DLL_PROJECT
#define  TEMPLATE_IM_EXPORT __declspec(dllexport)
#else
#define TEMPLATE_IM_EXPORT 
#endif
#ifdef DLL_PROJECT
#define  NORMAL_IM_EXPORT __declspec(dllexport)
#else
#define NORMAL_IM_EXPORT __declspec(dllimport)
#endif

分為普通的匯入匯出宏,和原始碼匯出的情況。

2.標頭檔案

template <typename T>   //模板類
class imexdll
{
public:
	T addit(T a, T b);
};
//當需要匯出時,需要特例化需要匯出的型別
template class TEMPLATE_IM_EXPORT imexdll<int>;  
 
//模板函式的匯出
template<typename T>  int fn1(T t1, T t2);
//需要特化匯出型別
template NORMAL_IM_EXPORT int fn1(int t1, int t2);
 
//普通函式/類的匯出
NORMAL_IM_EXPORT int fn2(int a, int b);
 
//普通類中包含模板函式的情況,模板函式機械上src…… 沒查到別的方法
class NORMAL_IM_EXPORT imexdll2
{
public:
	template <typename T>
	T add(T a, T b)
	{
		return a + b;
	}
};

3.原始檔

#include "imexdll.h"
 
template <typename T>
T imexdll<T>::addit(T a, T b)
{
	T c = a + b;
	//cout << "sum:" << c << endl;
	return c;
}
template <typename T> int fn1(T t1, T t2)
{
	return t1 + t2;
}
int fn2(int a, int b)
{
	return a + b;
}

4.為何不擔心普通類中模板函式洩露核心程式碼?

對於模板函式,正常其實現功能都是呼叫模板type 對應下的具體功能,所以只要將具體的type 對應的實現過程封裝好,核心程式碼是不會洩露的。




源自:

https://blog.csdn.net/jerry_yu_1/article/details/120741848

相關文章