2010-08-12 62 views
6

我有大量的代碼,用/ MT編譯(即期望與CRT靜態鏈接)。我需要將它與一個靜態的第三方庫結合起來,該庫已經用/ MD構建(即期望動態鏈接CRT)。用/ MT編譯的混合代碼和/ MD

理論上可以將兩者鏈接成一個可執行文件而無需重新編譯?

如果我使用/ nodefaultlib:msvcrt進行鏈接,那麼我最終會收到少量未定義的引用,例如__imp__wgetenv。我很想嘗試在我自己的代碼中實現這些功能,轉發到wgetenv等。這是否值得嘗試,還是直接進入下一個問題?

不幸的是,我採取裝箱第三方的代碼放到一個單獨的DLL的容易的選擇,禁止: -/

回答

3

號/ MT和/ MD是互斥的。

傳遞給鏈接的給定調用的所有模塊必須在編譯時使用相同的運行時庫編譯器選項(/MD/MT/LD)。

Source

+0

不是我希望的答案,但謝謝;-) – slowdog 2010-08-13 08:52:27

0

我發現了OpenSSL的來源這樣的解決方案:/MT/Zl:圖書館的所有OBJ文件與組合編譯。正如作者所描述的那樣,這樣的組合允許建立具有利用動態CRT(/MD)或靜態CRT(/MT)的應用進行編譯的靜態庫。

0

我面臨着類似的情況,我有兩個庫,一個是用MT構建的,另一個是用MD構建的。我不得不建立一個使用來自兩個庫的功能的可執行文件。作爲醫學博士建立的圖書館是第三方,因此我無法重建它,並建立了圖書館,因爲MT有許多依賴關係,並將它們全部建成,因爲MD是一個巨大的痛苦。我從第三方配置頭文件中獲取錯誤,這使得它強制將可執行文件構建爲MD。我正在尋找簡單的方法來打包第三方DLL作爲一個單獨的DLL提到的問題。但是,我無法通過這種簡單的方式在線找到足夠的解釋。因此,我的兩美分以下。 以下是我規避它的方式

  1. 我構建了另一個作爲接口的.dll文件。這個界面基本上包裝了對第三方dll所做的所有api調用。這個接口的頭文件沒有包含來自第三方dll的任何頭文件,而是所有這些頭文件都包含在interface.cpp文件中。如您所期望的界面被構建爲MD。
  2. 現在在我的main.cpp文件中,我包含了這個接口頭文件,以通過接口對第三方DLL進行所有調用。

  3. 在傳遞接口參數時必須格外小心。像int,bool等基本變量可以作爲值傳遞。但是任何類或結構都需要作爲const引用傳遞以避免堆損壞。這適用於連字符串。

如果不清楚,歡迎與我們分享更多細節!