2013-02-13 90 views
0

我有一個解決方案,它由本機C++ DLL和C++/CLI包裝器組成。我的目標是在本機C++ DLL的C++/CLI中創建一個包裝器。混合本機C++和C++/CLI

每當我嘗試在包裝器中創建本機C++類的實例時,遇到很多鏈接器錯誤(請參見下文)。在C++/CLI中的原生C++ DLL

2> .NETFramework,Version=v4.0.AssemblyAttributes.cpp 
2>NFileOperation.obj : error LNK2028: unresolved token (0A000208) "public: static bool __cdecl CFileOperation::FileExists(class ATL::CStringT<wchar_t,class ATL::StrTraitATL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > const &)" ([email protected]@@[email protected][email protected][email protected][email protected]@@@[email protected]@@[email protected]@@Z) referenced in function "[T2M] void __clrcall `dynamic initializer for 'public: static float * tagVARIANT::* ATL::CVarTypeInfo<float *>::pmField''(void)" ([email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@@[email protected][email protected]@YMXXZ) 
2>DeskUpdateManaged.obj : error LNK2028: unresolved token (0A00021C) "public: static bool __cdecl CFileOperation::FileExists(class ATL::CStringT<wchar_t,class ATL::StrTraitATL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > const &)" ([email protected]@@[email protected][email protected][email protected][email protected]@@@[email protected]@@[email protected]@@Z) referenced in function "public: bool __clrcall DeskUpdateManaged::Conversion::FileExist(class System::String ^)" ([email protected]@[email protected]@[email protected]@@@Z) 
2>DeskUpdateManaged.obj : error LNK2019: unresolved external symbol "public: static bool __cdecl CFileOperation::FileExists(class ATL::CStringT<wchar_t,class ATL::StrTraitATL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > const &)" ([email protected]@@[email protected][email protected]_W[email protected][email protected]@@@[email protected]@@[email protected]@@Z) referenced in function "public: bool __clrcall DeskUpdateManaged::Conversion::FileExist(class System::String ^)" ([email protected]@[email protected]@[email protected]@@@Z) 
2>NFileOperation.obj : error LNK2001: unresolved external symbol "public: static bool __cdecl CFileOperation::FileExists(class ATL::CStringT<wchar_t,class ATL::StrTraitATL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > const &)" ([email protected]@@[email protected][email protected][email protected][email protected]@@@[email protected]@@[email protected]@@Z) 
2>C:\Users\ABGZAMANK\Music\DeskUpdate\Dev\Source\Solution\Debug\DeskUpdateManaged.dll : fatal error LNK1120: 3 unresolved externals 

函數調用:

bool NFileOperation::FileExists(CAtlString sPathName) 
{ 
    return CFileOperation::FileExists(sPathName); 
} 

是否有更充足的方法是什麼我想達到什麼目的? 任何有關這個問題的建議非常感謝。

+1

您是否將本機庫設置爲CLI鏈接器的輸入? – 2013-02-13 09:23:29

+0

我不確定,如何檢查我是否有? – 2013-02-13 09:45:02

+0

右鍵單擊您的項目 - >屬性 - >連接器。在常規站點上指定其他庫目錄。在輸入站點上指定輸出.lib作爲附加依賴項。 – 2013-02-13 10:00:54

回答

0

看來您的本機C++代碼正在使用ATL/MFC。假設您在VS下編譯,請轉至C++/CLI項目的項目屬性 - >配置屬性 - >常規並選擇「使用MFC」和「使用ATL」爲靜態庫或共享DLL(取決於您的項目類型)。該標誌將添加必要的包含路徑,將路徑和庫鏈接到項目中,以便在項目中使用ATL/MFC類型。此外,確保您將C++/CLI項目與您的本地C++項目鏈接起來,以避免鏈接項目錯誤(可在常規和輸入項目屬性的鏈接器部分中找到)。

+0

我試着用ATL和MFC編譯項目作爲靜態庫和動態庫,但是它們在調試模式下無法編譯。然而,該項目在發佈模式下編譯並且鏈接器錯誤仍然存​​在。請你可以通過鏈接C++/CLI項目與本機C++來解釋你的意思(我不知道我是否已經正確完成了)? – 2013-02-13 15:42:03

+0

@Khalid:您的原生C++代碼和託管包裝是否屬於同一個項目?這是非常不可取的。你應該讓它們在不同的程序集(項目)中分開。請參閱http://stackoverflow.com/questions/4642702/wrapping-unmanaged-c-with-c-cli-a-proper-approach – eladidan 2013-02-13 16:34:21

+0

@Khalid:另外,您的本機C++ dll是否創建一個導出庫?它肯定應該,否則你將需要使用LoadLibraryEx調用方法......如果有,你需要在C++/CLI包裝器項目中與導入庫鏈接,就像Nico在你的問題中所評論的一樣。 – eladidan 2013-02-13 16:38:15