2013-08-07 46 views
3

我想在Visual Studio 2008中編譯和鏈接我的項目作爲調試項目(MTd)。該項目包括幾個外部dll,其中一個dll與非調試版本(MD和MT版本)一樣。現在,如果我試圖鏈接我的項目,它要麼重新聲明LIBCMT.lib和LIBCMTD.lib中的東西,要麼我試圖不允許非調試版本(/ NODEFAULTLIB:LIBCMT)它缺少符號。Visual Studio C++ - 鏈接LIBCMT.lib和LIBCMTD.lib(調試版本)

現在我可以使用所有外部庫的MT版本,但我仍然無法編譯&鏈接它爲MTd版本來調試我的項目,因爲相同的錯誤。

另一種方法(在我看來)將允許重新定義,我認爲是可能的@ gnu編譯器/鏈接器,但我無法找到任何關於Visual Studio的C++的東西。

有關如何處理此問題的任何想法? (請記住:不可能將外部dll編譯爲debug-dll)

作爲一個額外的一般問題:是否可以創建一個使用非調試dll的調試項目?

+3

您正試圖在您的程序中故意使用*多個*版本的CRT。你會得到一個用於你的EXE,另一個用於你的DLL,可能更多。這是非常非常不明智的,你在傳遞對象和指針時會遇到主要問題。一直使用/ MD,因此程序中只有一個CRT。 –

+0

是的,這是不明智和必要的......因爲我需要一個可調試的項目,並且只有一些外部DLL的發佈版本。對於發佈版本,它始終是一致的。 –

+1

您需要與在這些DLL上工作的程序員交談。當然,他們可以爲您提供調試版本。你不可能在這裏找到他們。 –

回答

3

看起來「正確」的解決方案是用相同的參數(MTd)重建所有外部庫。正如我所說,這是不可能的。我通過不忽略任何defaultlib解決了這個問題。相反,我找到了我正在尋找的參數。在鏈接器選項 - 我添加的其他行:/FORCE - 它忽略符號的重新定義。這不是一個完美的解決方案,它可能不適用於任何項目 - 但它仍然比沒有好......

另外,我必須設置增量鏈接爲否,否則embed.manifest贏得' t正確構建(雖然我讀過這也可能是一個反病毒問題)。