リンカー ツールの警告 LNK4248

未解決の typeref トークン (token) ('type') です。イメージを実行できません。

型には、MSIL メタデータに定義がありません。

LNK4248 は、MSIL モジュール (/clr でコンパイル) には型の前方宣言のみが存在し、その MSIL モジュールで型が参照され、かつその型の定義を含むネイティブ モジュールに対して MSIL モジュールがリンクされている状況で発生する可能性があります。

この状況では、MSIL のメタデータにあるネイティブの型定義がリンカーから提供され、それによって正しい動作が実現されます。

しかし、前方型宣言が CLR 型である場合、リンカーのネイティブの型定義が正しくない場合があります。

詳細については、「/clr (共通言語ランタイムのコンパイル)」を参照してください。

このエラーを解決するには

  1. MSIL モジュールに型定義を指定します。

次の例では LNK4248 が生成されます。 解決するには、構造体 A を定義します。

// LNK4248.cpp
// compile with: /clr /W1
// LNK4248 expected
struct A;
void Test(A*){}

int main() {
   Test(0);
}

次の例には、型の前方定義が存在します。

// LNK4248_2.cpp
// compile with: /clr /c
class A;   // provide a definition for A here to resolve
A * newA();
int valueA(A * a);

int main() {
   A * a = newA();
   return valueA(a);
}

次の例では LNK4248 が生成されます。

// LNK4248_3.cpp
// compile with: /c
// post-build command: link LNK4248_2.obj LNK4248_3.obj
class A {
public:
   int b;
};

A* newA() {
   return new A;
}

int valueA(A * a) {
   return (int)a;
}