2012-09-19 40 views
1

我正在嘗試創建一個CLI DLL,以在我的非託管C++可執行項目與另一個託管項目之間建立橋樑,所有這些都在一個Visual Studio解決方案中。從CLI C++項目引用非託管C++項目

但是,我遇到的問題早於:我無法在新CLI項目中鏈接引用非託管C++項目。我已經包含了所需的.h文件,並在CLI項目中添加了對非託管項目的引用。編譯成功,但我得到我之前沒有見過的鏈接錯誤:

錯誤2
錯誤LNK2028:無法解析的標記(0A000088)「公開:__cdecl ...

我有添加在項目屬性的引用,包括.h文件。

感謝

+0

您不能像託管的那樣「引用」非託管dll。相反,您必須將相應的.lib文件作爲輸入添加到鏈接器中 – stijn

回答

1

好像連接缺少對其他項目的一些中間信息。我真的不記得'引用'本地項目是否會自動設置鏈接階段..我實際上覺得很奇怪你說'參考'..對於我來說,「參考」這個詞有點侷限於.Net程序集的世界,因爲VS中的「添加引用」,這使得沒有人關心包含/庫以及哪些IIRC不可用於本地dll,原因很明顯。如果你的意思是你手動配置了鏈接器選項,那麼請原諒我:)

如果不是 - 請解釋你是如何引用本地模塊的。無論哪種方式,如果「引用」提前工作,文件名可能會失去同步,如果你重命名項目,也許文件時間戳有點關閉,VS沒有注意到新版本。簡單清除&重建有時神奇的幫助。如果沒有,您可以嘗試手動刪除Debug/Release/Bin/Obj文件夾,然後再次嘗試重建。

要嘗試進行診斷,第一步是查看鏈接器作爲輸入的內容:在C++/CLI項目的項目屬性頁面中,檢查Linker-> CommandLine並查看名稱類似於「那裏可以看到myOtherNativeCppProjectName.lib。如果不是 - 這裏有問題,只需將它添加到previos鏈接器頁面上的鏈接器選項中,或者重新執行引用添加,然後清理,重建並查看會發生什麼。

要說更多的話,你必須發佈整個錯誤消息 - 這是一個在函數名稱截斷,所以很難判斷它是你的函數還是一些缺少庫模塊。隨着編譯階段的成功,問題出現在鏈接上 - 你是否100%確定你已經實現了該功能?我的意思是,正確的.h文件肯定提供給C++/CLI項目,但是.cpp文件與本地包含的.h文件匹配。忘記添加一個文件也很常見。或者忘了實例化一個模板..或者錯誤地輸入.H和.CPP之間的類/函數名..

+0

非託管C++項目是可執行文件,因此不會創建.lib文件,因此無法在任何位置找到對lib文件的引用。是否可以引用其他項目的obj文件? – Gilad

+0

不,.obj文件是不應在項目構建之外使用的中間文件。他們是臨時人員,而不是最終產品。他們實際上可能會變得有用,因爲.obj建議像靜態庫中的原始模塊,但將這種嘗試作爲最後的手段。 .exe文件也可以生成.lib文件,就像普通的dll一樣 - 它們是否包含可導出的符號都是問題。你有沒有在你的.exe的代碼中使用'__declspec(dllexport)'?如果沒有 - 那麼沒有符號可導出,這就是爲什麼LIB沒有生成 - 它在空時跳過。 – quetzalcoatl

+0

參見http://stackoverflow.com/a/4008079/717732 – quetzalcoatl