2009-10-13 32 views
1

我在另一臺計算機上構建和運行項目時出現了一些奇怪的問題。這是一個並列的錯誤。通常原因是C++ redistributable未安裝在機器上等。但是在這種情況下,項目在該機器上編譯。安裝了MSVC++ 2005,運行時間應該在那裏(無論如何,我再次安裝了運行時)。爲什麼鏈接器引用一個在機器上不可用的運行時庫?在安裝了MSVC++ 2005的另一臺計算機上出現SideBySide錯誤

我正在動態鏈接到運行時庫。

有關如何調試此問題的任何想法?

謝謝。

編輯

我不想,因爲它涉及到開始另一篇文章。由於這個DLL版本混亂,這是靜態鏈接到運行時的一個很好的理由嗎?我會避免所有這些問題嗎?我沒有看到任何動態鏈接到運行時的優點。我的印象是,使用DLL運行時,您可以利用新的DLL獲得更新/錯誤修復的好處。然而,由於SxS和體現它確保它加載DLL的特定版本(舊版本)嗎?那麼動態運行時的意義何在呢?可能會節省幾kb的空間,因爲您沒有在所有相關庫中嵌入重用函數。但將此與應用程序的成本進行比較將無法運行,因爲某些古代運行時版本已從計算機中刪除,是否值得?

再次感謝。仍在追蹤原始問題,並可能必須重新編譯我正在使用的每個庫。

回答

5

sxstrace會告訴你SxS到底發生了什麼。它將顯示哪些dll被搜索以及它們如何映射到實際版本。

現在,加載哪個運行時是來自包含在項目中的清單文件。看看你提到的那個,它看起來像Visual2005中的那個,沒有服務包。 SP1改變了CRT到8.0.50727.762

Some details on sxstrace on vista and XP

好吧,既然你添加到你的問題一個問題,讓我一個答案添加到我的回答: 的SxS不一定會加載您在清單中指定版本。 SxS系統跟蹤針對特定版本的安全修復,例如並且即使在您要求特定版本時也會更改它加載的版本。這就是說,如果你的程序使用DL​​L,並且你想在它們之間共享C對象(例如malloc'ed內存),那麼你唯一的選擇就是CRT DLL。這真的取決於你的限制。

+0

8.0.50608.0是我在c:\ windows \ WinSxS文件夾下找不到的。謝謝,不知道sxstrace。 – Budric 2009-10-13 16:13:53

+0

你安裝了SP1嗎? – Bahbar 2009-10-13 16:32:04

1

不回答這個問題,但回答這個問題:

爲什麼鏈接引用運行時庫不可用機器上?

鏈接器不需要實際運行時庫鏈接。它只需要(通常)鏈接時的.lib文件。當操作系統在運行時找到dll時,.lib文件告訴鏈接器運行時庫將提供什麼(如導出符號)。

Dependency Walker可以幫助解決這個問題。

編輯:跟進到新的問題。靜態鏈接確實解決了這些問題,但它也引入了一些新問題。您可以在dll之間共享動態分配的對象 - 但是,無論哪個dll分配對象都必須是解除分配的對象。類似地,分配/重新分配/釋放成員數據/對象的對象上的任何方法都必須加以管理,以避免堆損壞。非內聯的refcounting /共享指針將會很有幫助。另外,shared mem allocators也可以有幫助。

+0

我明白了。我甚至不確定它是否是連接器決定使用name =「Microsoft.VC80.DebugCRT」version =「8.0.50608.0」或「清單生成器」,並且鏈接器嵌入清單......非常混亂。 – Budric 2009-10-13 15:47:43

+0

VC運行時的調試版本不可分發。如果您執行發佈版本,問題是否會發生? – 2009-10-13 15:54:47

+0

是的,無論是在發佈和調試。正如我所提到的,我安裝了完整的MSVC,所以我很乾淨/構建項目。 項目靜態鏈接到其他庫(例如Poco)。這些庫動態鏈接到運行時。這是問題嗎?如果是這樣,我不知道如何在一臺以上的機器上進行開發而不重建每一段代碼。 – Budric 2009-10-13 15:58:19

1

當您沿着第三方庫或目標文件進行編譯時,可能發生在另一臺計算機上編譯並在發生問題的計算機上覆制的文件。

試着在你的機器上找到這樣的二進制文件,並在該機器上重新編譯它們。

0

這是possibly related forum post。不知道這是否是問題,但它似乎值得檢查。

總結是MS通過自動更新更新了VS 2005開發人員機器上的ATL,CRT,MFC和其他一些庫。

在未安裝VS2005的機器上,他們只通過自動更新更新ATL,導致SxS錯誤。

您可以卸載開發機器上的更新,也可以在試圖運行的機器上手動升級運行時。有關post的詳細信息。

相關問題