2014-12-03 94 views
0

當我構建我的靜態庫時,它是否與運行時庫鏈接?它是否將運行時庫中的代碼「放」到我的lib中?爲什麼我需要爲靜態lib構建指定運行時庫類型?

或者它只是鏈接器的信息,以便當它鏈接到最終的exe(dll)時,它知道該特定靜態庫使用哪個版本的運行時庫?

我是否需要在所有靜態庫和DLL中使用相同版本的運行時庫? 我是否需要在所有靜態庫和DLL中使用相同類型(/ MT/MTd/MDd ...)?

還有一個小問題,靜態窗口庫通常是Linux靜態庫大小的兩倍嗎?

+0

快速測試。將運行時庫更改爲非現在設置的內容。按「Build」(不要*做一個「重建所有」)。請注意,整個庫從頭開始重新編譯,編譯所有模塊。考慮到你所有的問題,這表明了什麼? – PaulMcKenzie 2014-12-03 16:37:53

回答

1

或者是用於連接只是信息,這樣當它連接最終 exe文件(DLL),它知道什麼版本的運行時庫用於此 特定的靜態庫?

是的。

我是否需要在我的所有靜態庫中使用相同版本的運行時庫 libs和dll?

我強烈建議。如果你不這樣做,你會得到一連串的鏈接錯誤。

我是否需要在我的所有靜態文件中使用相同類型(/ MT/MTd/MDd ...)libs和dll?

是的。

如果您要發佈一個由第三方使用的DLL,您可能需要爲它們提供使用/ MTd標誌的YourLibraryD.dll和使用/ MT的YourLibrary.dll。每種解決方案都有不同的配置。沒有人再使用單線程版本,因爲性能損失現在大多不相關,不值得冒這個風險。

編輯:即使你沒有發佈到第三方,你仍然要確保你在調試 - 釋放模式下連接到正確的DLL。這是因爲當您在使用/ MTd的Debug中構建YourApp.exe時,您會希望它鏈接到YourLibraryD.dll。當您在發佈中使用/ MT構建YourApp.exe時,您會希望它在發佈模式下鏈接到YourLibrary.dll。您可以保持DLL名稱相同並使用該目錄消除歧義:因此,然後在調試模式下鏈接到bin \ debug \ YourLibrary.dll,並在發佈模式下鏈接到bin \ release \ YourLibrary.dll。很抱歉,如果這超出了你的問題,那麼知道你什麼時候第一次切換構建配置並突然發生鏈接器錯誤纔是好事。

+0

小心使用'/ MTd'構建的'YourLibraryD.dll'。您不能像這樣分發這些內容(針對Microsoft EULA)。 – PaulMcKenzie 2014-12-03 16:42:58

+0

@PaulMcKenzie你確定嗎?我以爲你不能分發調試MSVCRT.DLL,但你應該能夠分發你自己的庫來反對它。 – 2014-12-03 16:46:43

+0

是的,您不能分發MSVCRTD.DLL。這個問題真的源於程序員聲稱只有他們的程序的調試版本工作,並試圖分發它(提示他們也分發「MSVCRTD。DLL「)。 – PaulMcKenzie 2014-12-03 16:51:09

相關問題