2009-06-01 93 views
6

我是託管C++的新手。託管C++無法解析的令牌

我在一個.sln,Project Lib和Project LibTest中有兩個託管的C++項目。 LibTest使用Lib。

Lib編譯並鏈接正常。該項目設置爲.dll。

LibTest也被編譯爲.dll,但是當它進入鏈接時,我會在所有Lib ::方法中得到「未解析的標記」。這些方法定義在Lib .cpp文件中定義。

如果我將定義移入Lib.h文件,一切正常。

我已經修改了LibTest的Reference來依賴於Lib項目。

我錯過了什麼?

編輯:好吧,這正是我所擁有的,它仍然不起作用。

首先,我使用的是Visual Studio 2008 SP1。

其次,當我在C#中做了類似的練習時,它運行良好。

我創建了一個空的C++ CLR項目。我添加了一個Lib項目。我添加了一個託管類。 VSTD生成Lib.h和Lib.cpp。構造函數是自動生成的。

然後我又添加了另一個項目到我的解決方案;我稱之爲LibTest。我添加了另一個名爲LibTest的託管類。生成LibTest.h和LibTest.cpp。我試圖實例庫中LibTest構造,但在連接過程中它只是說:

1> LibTest.obj:錯誤LNK2020:未解決的令牌(06000002)庫:: ctor的

這裏是確切的代碼:

庫項目(編譯爲.dll文件的項目)

//Lib.h 
#pragma once 

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


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

Lib::Lib(void) 
{ 
} 

LibTest項目(編譯爲application.exe)

// 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

Wow..I必須從非託管C++ say..coming ..我一直想開發環境(在這種情況下, VSTD IDE)來管理#include,以及所有庫鏈接,而無需我明確指定它。這真是太神奇了!我想告訴整個非託管C++世界! (我只落後6年!= p) – sivabudh 2009-06-02 20:25:47

回答

9

託管C++的工作方式就像C#一樣,涉及不同程序集中的類型。這意味着,你需要聲明你Lib類爲public

public ref class Lib 

,你不應該包括Lib.hLibTest項目。當您添加對Lib項目的引用時,編譯器將能夠解析在那裏找到的任何符號。

您當前的代碼包含Lib.h,因此鏈接程序在LibTest程序集中搜索Lib類,並在其中查找構造函數。

+0

謝謝,Bojan;問題解決了。我希望我可以投票給你10次..但是stackoverflow只允許1. ;-) – sivabudh 2009-06-02 20:21:27

1

如果您使用託管擴展,正確設置引用應該是您所需要的。

如果您使用的是標準C++函數,則可能需要使用__declspec(dllexport)__declspec(dllimport)來定義函數。 See MSDN for details

__declspec(dllexport)是將特定函數添加到導出庫中,__declspec(dllimport)告訴導入庫(LibTest)它需要從DLL中導入這些符號。

+0

是的......他們都是託管的。這真是令人費解。 – sivabudh 2009-06-01 20:34:09

0

下面是由Bojan提出的最終修改。謝謝Bojan!

注意:不要忘記將「Lib」添加到您的「LibTest」參考中!

庫項目(編譯爲.dll文件的項目)

//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; 
}