爲了簡單起見,我將DLL_TUTORIAL.dll和頭文件MathFuncsDll.h放在根文件夾C:\中。延遲加載DLL
然後,創建空的項目,設置
配置屬性 - >連接器 - >輸入 - >延遲加載的DLL的
到
C:\ DLL_TUTORIAL .dll;%(DelayLoadDLLs)
和
配置屬性> VC++ Directories->包含目錄
到
C:\; $(INCLUDEPATH)
編者命令:
/Zi/nologo/W3/WX-/O2/Oi/Oy-/GL/D「_MBCS」/ Gm-/EHsc/MT/GS /Gy/fp:precise/Zc:wchar_t/Zc: forScope /Fp"Release\clean_rough_draft.pch 「/法 」發佈\「/ FO 」發佈\「 /Fd"Release\vc100.pdb」/ GD/analyze-/errorReport:隊列
該項目只包含帶有main的文件。
的main.cpp
#include <Windows.h>
#include <iostream>
#include "MathFuncsDll.h"
using namespace MathFuncs;
using namespace std;
int main()
{
std::cout<< MyMathFuncs<int>::Add(5,10)<<endl;
system("Pause");
return 0;
}
的Dll已經在不同的解決方案成功編譯。
MathFuncsDll.h
namespace MathFuncs
{
template <typename Type>
class MyMathFuncs
{
public:
static __declspec(dllexport) Type Add(Type a, Type b);
static __declspec(dllexport) Type Subtract(Type a, Type b);
static __declspec(dllexport) Type Multiply(Type a, Type b);
static __declspec(dllexport) Type Divide(Type a, Type b);
};
}
這些函數定義:
#include "MathFuncsDll.h"
#include <stdexcept>
using namespace std;
namespace MathFuncs
{
template <typename Type>
Type MyMathFuncs<Type>::Add(Type a,Type b)
{ return a+b; }
template <typename Type>
Type MyMathFuncs<Type>::Subtract(Type a,Type b)
{ return a-b; }
template <typename Type>
Type MyMathFuncs<Type>::Multiply(Type a,Type b)
{ return a*b; }
template <typename Type>
Type MyMathFuncs<Type>::Divide(Type a,Type b)
{
if(b == 0) throw new invalid_argument("Denominator cannot be zero!");
return a/b;
}
}
運行該程序失敗:
1> main.obj:錯誤LNK2001:解析的外部符號「 public:static int __cdecl MathFuncs :: MyMathFuncs :: Add(int,int)「(?Add @?$ MyMathFuncs @ H @ MathFuncs @@ SAHHH @ Z) 1> C:\用戶\託梅克\文檔\ Visual Studio 2010的\項目\ clean_rough_draft \發佈\ clean_rough_draft.exe:致命錯誤LNK1120:1周無法解析的外部
你能指出我的錯誤?
不支持導出模板方法。你必須把它們放在.h文件中。這留下了一個空的DLL。 –
詳細說明,Template方法不是「真正的」方法 - 它們只是在編譯時用於創建方法的模具。因此模板方法不能編譯成目標代碼。 – nakiya