2009-09-03 59 views
0

我有一個使用本機C++和C++/CLI構建的項目。我有以下組成部分:.NET符號從程序集中消失

 
Assembly A (C++/CLI) 
| uses 
Assembly B (C++/CLI) 
| uses 
Static Lib C (Native C++) 

我做了靜態庫的C的主要重寫,並將其編譯,並使用它的其他本地項目編譯罰款爲好。在重新編寫組件B時沒有發生任何變化 - 並且如我所料,當我編譯程序集B時,它編譯時沒有錯誤或警告。但是,當我嘗試編譯程序集A時,找不到在程序集B中可用的符號,導致出現數百個錯誤。我嘗試在A項目中添加和刪除B和C作爲參考,但沒有運氣。我嘗試做一個乾淨的,從頭開始重建所有東西 - 但仍然沒有運氣。我在RedGate的Reflector中加載了Assembly B,並且我看不到這些符號,所以至少這是一致的。我正在一個分支上工作,所以我從trunk中加載了一個早期版本的Assembly B(它要求卸載我從分支加載的以前版本),並且可以看到它中的所有符號。所以當我看到我目前版本的Reflector中的Assembly B時,我看到:

 
+TFModelSetNETD, Version=1.0.3532.42171, Culture=neutral, PublicKeyToken=null 
    +TFModelSetNETD.dll 
    + References 
     + {} - 
     + <CppImplementationDetails> 
     + <CrtImplementationDetails> 
     + vc_attributes 

就這樣。在舊版本中,我看到了這四個條目,加上我在Assembly B,Static Lib C,其他庫中聲明的所有命名空間,以及幾個boost和std命名空間。我應該提到這是在Visual Studio 2008中。

關於這裏發生了什麼的任何想法?我無法理解我可以做什麼來使編譯器不導出任何符號,也沒有給我任何警告。

想法,提示或調試建議都非常感謝。

編輯:我已將Static Lib C加載到LibDump中,並且所有符號都存在 - 但是,在用Assembly B進行檢查時,組件B中定義的或者從Static Lib C引用的符號都不可見紅門反射器。

+0

A和B是一個dll左右嗎? – Lodle 2009-09-03 06:35:51

+0

有沒有什麼辦法可以檢查程序集B的.vcproj文件的舊版本(從什麼時候開始工作),並將它與最新的.vcproj文件進行比較以得到相同的程序集?這些文件只是在某種程度上是人類可讀的,可能會暗示某些標誌/選項可能會意外地觸發了該項目... – reuben 2009-09-03 06:37:37

+0

Lodle:A和B都是DLL Reuben:好的建議!我試過了,除了頭文件和cpp文件部分的差異之外,唯一的變化是:1)我發現我的proj被設置爲Unicode,而我們擁有的其他所有東西都是MBCS,而且我打開了「ShowIncludes,然後把它關掉,所以在新的proj中有一個ShowIncludes = false。我把字符設置改回了MBCS,清理並構建了,但沒有歡樂。 感謝您的意見! – 2009-09-03 12:06:48

回答

0

發生了什麼事情是所討論的符號的頭文件從未被包含在任何地方的cpp文件中。我對它的工作原因的唯一解釋是,也許其他編譯單元中的一個間接包含了標題,但是當它在重寫中發生變化時,符號不再被包含在任何地方。信不信由於與下一個相比,這個問題很容易 - boost :: thread導致程序集在加載時拋出一個異常,因爲與DLL初始化和線程本地存儲相關的衝突。