2009-06-01 15 views
6

管理対象C++を初めて使用しました。管理されたC++の未解決トークン

私は1つの.sln、Project LibとProject LibTestに2つのマネージC++プロジェクトを持っています。 LibTestはLibを使用します。

Libはコンパイルとリンクが正常です。プロジェクトは.dllとして設定されています。

LibTestも.dllとしてコンパイルされますが、リンクすると、すべてのLib ::メソッドで「未解決のトークン」が取得されます。これらのメソッドの定義はLib .cppファイルで定義されています。

定義をLib.hファイルに移動した場合、すべてが機能します。

私は既にLibプロジェクトに依存するLibTestのリファレンスを変更しました。

私には何が欠けていますか?

EDIT:これはまさに私が持っているものであり、それでも動作しません。

まず、Visual Studio 2008 SP1を使用しています。

第2に、私がC#で同様のエクササイズを行ったとき、うまくいきました。

私は空のC++ CLRプロジェクトを作成しました。私はLibプロジェクトを追加しました。私はマネージドクラスを追加しました。 VSTDはLib.hとLib.cppを生成しました。コンストラクタは自動的に生成されます。

次に私の解決策に別のプロジェクトを追加しました。私はそれをLibTestと呼んだ。 LibTestという別のマネージクラスを追加しました。 LibTest.hとLibTest.cppが生成されます。私はLibTestコンストラクタでのLibをインスタンス化しようとしましたが、リンク時に、それは単に言った:

1> LibTest.obj:エラーLNK2020:。

:未解決のトークン(06000002)のLib ::を

CTORここで正確なコードです(.dllはプロジェクトとしてコンパイル)

のLibプロジェクト(application.exeとしてコンパイル)

//Lib.h 
#pragma once 

ref class Lib 
{ 
public: 
    Lib(void); 
}; 


//Lib.cpp 
#include "Lib.h" 

Lib::Lib(void) 
{ 
} 

LibTestプロジェクト

// LibTest.h 
#pragma once 

ref class LibTest 
{ 
public: 
    LibTest(void); 
}; 

// LibTest.cpp 
#include "LibTest.h" 
#include "Lib.h" 

LibTest::LibTest(void) 
{ 
    Lib^ lib = gcnew Lib; 
} 

int main() 
{ 
    return 0; 
} 
+0

VSTD IDE)を#includeと明示的に指定せずにリンクするすべてのライブラリを管理します。これはかなり素晴らしいです!私はこの全体の管理されていないC++の世界に伝えたい! (私はわずか6年後です!= p) – sivabudh

答えて

9

Managed C++は、異なるアセンブリの型に関してC#と同じように機能します。これが意味することは、publicとしてあなたLibクラスを宣言する必要があるということです。

public ref class Lib 

そして、あなたはあなたのLibTestプロジェクトでLib.hを含めるべきではありません。 Libプロジェクトへの参照を追加すると、コンパイラは見つかったシンボルを解決できます。

現在のコードにはLib.hが含まれているため、リンカーはLibTestアセンブリのLibクラスを検索し、そのコンストラクタを検索します。

+0

ありがとう、Bojan;問題が解決しました。私はあなたが10回投票することができたらいいと思う。しかし、stackoverflowは1つしか許さない。 – sivabudh

+1

いつでも - 私はそれが助けてうれしいよ:) –

1

管理拡張を使用している場合は、参照を正しく設定する必要があります。

標準のC++関数を使用している場合は、おそらく__declspec(dllexport)__declspec(dllimport)を使用して関数を定義する必要があります。 See MSDN for details

__declspec(dllexport)は、エクスポートライブラリに特定の機能を追加するものである、と__declspec(dllimport)は、それがDLLからこれらのシンボルをインポートする必要があるとインポートライブラリ(LibTest)に指示します。

+0

はい...それらはすべて管理されています。これは本当に困惑しています。 – sivabudh

0

Bojanが提案した最終的な変更は次のとおりです。ありがとうBojan!

注: "Lib"を "LibTest"リファレンスに追加するのを忘れないでください! (.dllはプロジェクトとしてコンパイル)

Libのプロジェクト

//Lib.h

#pragma once 

public ref class Lib 
{ 
public: 
    Lib(void); 
}; 

//Lib.cpp

#include "Lib.h" 

Lib::Lib(void) 
{ 
} 

LibTestプロジェクト(アプリケーションとしてコンパイル.exe)

// LibTest.h

#pragma once 

ref class LibTest 
{ 
public: 
    LibTest(void); 
}; 

// LibTest.cpp

#include "LibTest.h" 

LibTest::LibTest(void) 
{ 
    Lib^ lib = gcnew Lib; 
} 

int main() 
{ 
    return 0; 
} 
Wow..Iは、私はいつもこのような場合には(開発環境を望んでいる。..アンマネージドC++からsay..coming必要があります
関連する問題