2013-10-06 18 views
3

對於在Linux和Windows上構建的跨平臺軟件項目,我們有不同的方式來處理第三方庫。在Linux上,我們使用CentOS/RHEL發行版發佈的版本進行構建和鏈接,這意味着我們與發佈版本鏈接,而在Windows上,我們維護自己的第三方庫「包」,在Windows上,我們構建了每個庫的兩個版本 - 鏈接msvcr100和msvcp100的發行版以及鏈接msvcr100d和msvcp100d的調試版。是/ nodefaultlib:msvcr100處理msvcr100.dll與msvcr100d.dll defaultlib問題的正確方法

我的問題只是在Windows上構建第三方依賴項的調試版本,還是在構建我們自己的軟件的調試版本時,我們可以簡單地使用/ nodefaultlib:msvcr100。

後續問題:我在哪裏可以瞭解到這方面的良好實踐。我已經閱讀了有關msvc運行時的MSDN頁面,但在建議方面幾乎沒有。

編輯:

讓我更簡潔地重述這個問題。使用VS2010時,使用/ nodefaultlib時出現問題:msvcr100在與使用/ MD編譯的庫鏈接時將可執行文件與/ MDd鏈接起來。

我的動機是避免必須構建我使用的第三方庫的發行版和調試版。另外我希望我的調試版本運行得更快。

從(使用運行時庫)文件爲/ MD,/ MT,/ LD:

MD:使你的應用程序使用運行的multithread-和具體的DLL版本時間庫。定義_MT和_DLL並使編譯器將庫名稱MSVCRT.lib放入.obj文件中。

使用此選項編譯的應用程序靜態鏈接到MSVCRT.lib。這個庫提供了一個允許鏈接器解析外部引用的代碼層。實際的工作代碼包含在MSVCR100.DLL,這必須是可用在運行時與MSVCRT.LIB

/MDD鏈接的應用程序:定義_DEBUG,_MT和_DLL,並使您的應用程序使用調試多線程 - 和運行時庫的DLL特定版本。它還會使編譯器將庫名稱MSVCRTD.lib放入.obj文件中。

因此,除了_DEBUG被定義之外,沒有任何文檔對生成的代碼進行任何修改。

回答

3

您只能使用CRT的Debug版本來調試您的應用程序。它包含許多斷言,以幫助您在代碼中發現錯誤。你從來沒有運送你的項目的調試版本,總是發佈版本。你也不能,許可證禁止運送msvcr100d.dll。因此,正確構建項目會自動避免依賴CRT的調試版本。

/nodefaultlib鏈接器選項是打算允許鏈接您的程序與自定義CRT實現。相當罕見,但一些程序員關心構建小程序,標準CRT並不算小。

有些程序員使用/ nodefaultlib在鏈接問題上有黑客攻擊。當它們將使用調試配置設置構建的代碼與使用發佈配置設置構建的代碼鏈接時引發。或鏈接代碼與CRT選擇不兼容,/ MD與/ MT。這可以工作,但不能保證,但當然只能掃除地板墊下的真正問題。

所以不,這不是正確的選擇,修復核心問題應該是你的目標。確保所有.obj和.lib文件都使用相同的編譯器選項構建,並且不會出現此問題。如果這意味着你必須糾正一個圖書館所有者的正確構建,那麼先纏住它,只有當你發現你不想再依賴這個.lib時,纔會繞過它,但是還沒有時間去尋找替代品。

+0

嗨漢斯,謝謝你的回答。這不是我正在尋找的東西,但我會承擔責任。我的問題措辭不佳。我會盡快更新。 – pong