簡単にするために、ヘッダーMathFuncsDll.hを含むDLL_tokyo.dllの両方をルートフォルダーC:\に配置しました。
次に、空のプロジェクトを作成し、設定します
構成プロパティ->リンカー->入力->ロードされたDLLの遅延
に
C:\ DLL_tokyo.dll;%(DelayLoadDLLs)
と
構成プロパティ->VC++ディレクトリ->ディレクトリを含める
に
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 "/ Fa" Release \ "/ Fo" Release \ "/ Fd" Release \ vc100.pdb "/ Gd / analysis- / errorReport:queue
このプロジェクトには、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:\ Users \ Tomek \ Documents \ Visual Studio 2010 \ Projects \ clean_rough_draft \ Release \ clean_rough_draft.exe:致命的なエラーLNK1120:1つの未解決の外部
私の間違いを指摘してもらえますか?