2010-10-18 65 views
0

我想用託管C++包裝託管C++ DLL,並且不斷收到鏈接錯誤。用託管類包裝C++ DLL

即使我將我的library.lib包含在項目中幷包含正確的頭文件。

這是管理類:

#pragma once 
#include "..\Terminal\Terminal.h" 
public ref class ManagedTerminal 
{ 
    private: 
Terminal * m_unTerminal; 
public: 

ManagedTerminal(void) 
{ 
    m_unTerminal = new Terminal(); 
} 
}; 

這也是非託管類:

#include "..\Core1.h" 
#include "..\Core2.h" 

__declspec(dllexport) class Terminal 
{ 
private: 
CoreObj m_core; 

public: 
Terminal(); 
void Init(char* path, char* filename);  
void Start(); 
void Stop(); 
void Run(); 
Array<Report> GetSnapshot(); 
~Terminal(void); 
}; 

和錯誤,我得到的是:

錯誤5錯誤LNK2028:無法解析的標記( 0A0000B3)函數「public:__clrcall ManagedTerminal :: ManagedTerminal(void)」中引用的「public:__thiscall Terminal :: Terminal(void)」(?? 0Terminal @@ $$ FQAE @ XZ)(?? 0ManagedTerminal @@ $$ FQ $ AAM @ XZ)Ma nagedTerminal.obj TerminalWrapper

錯誤6錯誤LNK2019:解析外部符號 「公共:__thiscall終端::終端(無效)」(?? 0Terminal @@ $$ FQAE @ XZ)在函數引用「公共:__clrcall ManagedTerminal :: ManagedTerminal(void)「(?? 0 ManagedTerminal @@ $$ FQ $ AAM @ XZ)ManagedTerminal.obj TerminalWrapper

有人可以告訴我出了什麼問題嗎? 謝謝:)

+0

非託管C++ dll是否使用boost :: thread? – 2010-10-18 20:32:54

+2

可能的重複[我嘗試使用託管C++包裝本機C++類時獲得LNK2028](http://stackoverflow.com/questions/721387/i-get-lnk2028-when-trying-to-wrap-native-c- class-using-managed-c) – 2010-10-18 20:33:11

+0

您可以嘗試製作可能會再現問題的小例子嗎? – Vlad 2010-10-18 20:36:14

回答

1

你必須匹配所有的構建設置 - 特別是調用約定(CDECL與STDCALL) - 纔能有一個成功的鏈接。

由於.NET 2.0,您還必須動態鏈接到c-runtime,因此請確保.dll和託管的C++項目都這樣做。

基本上,進入兩個項目的屬性對話框,並確保影響呼叫的事情是相同的。

+0

我已經將託管項目的調用約定更改爲「__cdecl」(如在非託管項目中),但現在出現錯誤:錯誤致命錯誤LNK1104:無法打開文件'.. \ Debug \ Terminal.lib'\t 即使它在那裏。 – Idov 2010-10-19 08:43:56

+0

從Microsoft下載procmon.exe併爲包含Terminal.lib的路徑設置過濾器,並確保它使用您認爲它的PATH。另外,如果它打不開,procmon會告訴你爲什麼。 – 2010-10-19 11:50:11

相關問題