2013-04-02 107 views
2

我有一個項目,我需要爲本地C++ SDK製作一個Visual C++包裝器,以便它最終可以在C#中使用。如何在Visual C++項目中引用.lib文件(本機C++)?

SDK包含的.h文件,我正確地包括(這些沒有編譯錯誤)和一些需要被引用的.lib文件。這似乎是棘手的部分。

正如我在this question中所解釋的,每當我嘗試調用屬於庫的一部分的函數時,都會收到錯誤。這些錯誤是這樣的:

error LNK2080: unresolved token (0A000027) "public: static class vhtIOConn *__clrcall vhtIOConn::getDefault(enum vhtICRConn::DeviceType)" 
error LNK2019: unresolved external symbol "public: static class vhtIOConn * __clrcall vhtIOConn::getDefault(enum vhtIOConn::DeviceType)" 

據我所知,C++/CLR預計__clrdecl,而本地C++提供__clrcall

這是怎麼回事?我在很多地方都讀過,這是可能的,但我還沒有看到任何實際的工作示例。請注意,我正在使用Visual Studio 2010.

+0

哇。我總是驚訝於如何過分複雜但破碎的Windows'ABI。 +1,因爲獲得這樣的工作一定會很痛苦。 – 2013-04-02 10:17:31

+0

確實很痛苦。我試圖用這個網站作爲最後的手段,但現在我根本沒有絲毫的線索知道如何繼續。 –

+0

不幸的是,我不能真正幫助你 - 幸運的是,我從來沒有做過Windows編程,但是這裏有人肯定會有答案。 – 2013-04-02 10:29:57

回答

1

您可以知道鏈接器錯誤出了什麼問題,請注意錯誤消息中的__clrcall。這表明編譯器認爲你的本地C++正在編譯爲MSIL,而不是本地代碼。編譯得很好,任何兼容的C++ 03代碼都可以編譯爲MSIL,但在嘗試鏈接時會死亡。你必須讓它知道,你可以簡單地用#pragma來做:

#pragma managed(push, off) 
# include "foo.h" 
#pragma managed(pop) 
+0

你可能會詳細闡述一下嗎? 在我的示例中,我有一個'MainForm.h'文件,其中包含一對非託管C++文件。我們只需調用這些文件'foo.h'。如果我使用你發佈的代碼,它會給出很多'__clrcall不能用於編譯爲本地代碼的錯誤函數,這使我認爲它仍然把'foo.h'當作CLR代碼。我認爲將'managed'更改爲'unmanaged'會有所幫助,但它會增加:'不能使用/ clr:pure或/ clr:safe編譯非託管函數給所有這些實例。 –

+1

你的代碼沒有任何純粹或安全的東西,你需要用plain/clr編譯。 –

+0

我試過了,它工作。非常感謝!現在我很困惑,爲什麼[this](http://msmvps.com/blogs/vandooren/archive/2008/09/03/extending-a-native-c-project-with-managed-code.aspx)網站提供如此複雜的解決方案...... :) –

相關問題