2010-11-29 56 views
3

我鏈接到VS2008中的一些庫。如果我對鏈接器的瞭解是正確的,那麼MTd用於靜態鏈接,MDd用於動態鏈接(到DLL)。我的目標是靜態鏈接一些庫和其他動態鏈接。項目選項似乎只對鏈接器輸入中的所有庫有一個設置。我將如何做到這一點?Visual Studio:如何爲鏈接器指定不同的運行時庫? (/ MTd,MDd等)

+1

我不明白這是如何幫助我。沒有關於指定每個庫的鏈接器選項的部分。 – 2010-11-29 20:01:40

回答

3

根據您對新建項目嚮導提示的回答方式,您的項目在設置完成後將獲得一個合理的C運行時庫默認值。您可以檢查和改變這個(如果需要)如下:

  • 在解決方案資源管理器中右鍵單擊相關項目,選擇Properties
  • 外觀配置屬性下,C/C++,代碼生成,運行時庫。

但是您可以鏈接其他庫,但您只需指定鏈接到鏈接器,輸入,附加依賴項下的庫。

即使您正在鏈接到一個DLL,它仍然會有一個.LIB文件(用於DLL的正確形式)來解析外部引用,除非您手動加載該DLL並發現所需的函數入口點。

您確實需要確保鏈接的LIB文件與您的應用使用相同的CRT,否則事情可能會意外地出錯。

+0

我不認爲我們彼此瞭解。你的回答告訴我你對此知道,但我可能不理解。我的運行時庫是「多線程調試(/ MTd)」,我的鏈接器輸入是「cg.lib cgD3D9.lib Winmm.lib wininet.lib fbxsdk_20113_1d.lib d3d9.lib d3dx9.lib dinput8.lib dxguid.lib」是否這樣做看起來正確?原因是我認爲混合調試和發佈庫會導致問題。 – 2010-11-29 20:07:44

+1

在這裏查看Hans的附加信息。 `/ Mxxx`標誌決定了只有CRT版本**你當前的項目**鏈接到 - 每個應用程序必須鏈接到CRT。您希望使用的任何其他**庫都在您的項目屬性中命名 - 它們可以是靜態或動態的,但是如果您打算鏈接到任何DLL,則需要確保您的應用程序的CRT已準備好了DLL。任何更清楚? – 2010-11-29 20:10:23

4

不,你在混合它。/MD vs/MT選項只與您鏈接的CRT版本相關。有兩種,即只有在項目中不使用任何DLL的情況下才應使用的靜態版本(/ MT)。 DLL版本是您的進程中每個二進制文件都可以共享的版本,這樣您就不會有堆分配的痛苦。當內存由一個模塊分配並由另一個模塊釋放時,您會遇到的種種苦惱。

選擇您自己的庫完全取決於您。混合和匹配很好,鏈接器只是獲得另一種.lib。導入庫而不是靜態庫。請記住在使用DLL時使用/ MD。

0

您描述的鏈接器選項僅適用於CRT。靜態版本將限制你在模塊之間共享內存的方式。

您使用的所有其他庫將根據您提供(或不提供)鏈接器的.lib文件進行鏈接。

有3種方法使用MS庫

  1. 靜態鏈接靜態庫(.LIB equivelant的.o的.A歸檔)
  2. 靜態鏈接存根(生成的.lib編譯LOADLIB/getproc)動態庫的
  3. 如果您鏈接到一個lib,這是預建與MT手動加載一個動態庫(LOADLIB/GetProcAddress的)
0

和你所要求的MD是我的問題似乎成爲。

反之亦然。

它認爲我將不得不下載並重新建立外部依賴關係,因爲我現在被捕獲到22,當我選擇MT時,我的項目/解決方案的某些部分出現構建錯誤,當我選擇MD我得到另一部分的錯誤..

相關問題