簡體   English   中英

Microsoft Visual Studio〜C / C ++運行時庫〜靜態/動態鏈接

[英]Microsoft Visual Studio ~ C/C++ Runtime Library ~ Static/dynamic linking

我是Microsoft Visual Studio用戶。 我的問題是關於“ C / C ++運行時庫”的。

我使用包含以下代碼的“ .cpp”源文件“ main.cpp”創建了“空項目”:

#include <iostream>

int main(void)
{
    std::cout << "Hello World" << std::endl;
    return 0;
}

“ iostream是一個頭文件,用於C ++編程語言的輸入/輸出。它是C ++標准庫的一部分。”

  1. “ C / C ++運行時庫”和“ C / C ++標准庫”之間有區別嗎?

  2. 我如何知道“ C / C ++運行時庫”庫是靜態鏈接還是動態鏈接到項目?

  3. 我如何知道該庫在文件系統中的位置?

  4. 如果“ C / C ++運行時庫”是動態鏈接到項目的,我如何知道使用了哪個“ .dll”以及文件系統中所使用的“ .dll”在哪里?

  5. 假設我將“ C / C ++運行時庫”靜態鏈接到項目,可以確定從源代碼生成的可執行文件將在所有Windows平台(XP / Vista / Seven / ...,32位/ 64)上都可以運行位)?

  6. 將“ C / C ++運行時庫”動態鏈接到項目的優點/缺點是什么?

  7. 應該將“ C / C ++運行時庫”靜態還是動態鏈接到項目?

術語“ C / C ++運行時庫”沒有任何意義,它大致是IDE中項目設置的名稱。 項目+屬性,C / C ++,代碼生成,運行時庫設置。 您可以在/ MD和/ MT之間進行選擇。

使用默認設置/ MD,您的程序將使用運行時庫的DLL版本。 在您的計算機上,它們已由Visual Studio安裝程序復制到c:\\ windows \\ system32和/或c:\\ windows \\ syswow64。 並且您在VS安裝目錄的vc / redist子目錄中有它們的副本,在為程序創建安裝程序時可以在其中使用。 它們的三個版本分別是用於32位Intel處理器的x86,用於64位Intel處理器的x64和用於ARM處理器的arm。 根據您在項目中選擇的平台選擇合適的平台。

相關的DLL名稱是:

  • msvcr110.dll:C運行時庫(memcpy等)
  • msvcp110.dll:C ++標准庫(std :: string等)
  • vccorlib110.dll:Windows應用商店應用程序的運行時庫
  • vcomp110.dll:OpenMP的運行時庫(請參閱#pragma omp)
  • atl110.dll:ATL項目的運行時庫
  • mfc110 * .dll:MFC項目的運行時和本地化庫
  • vcamp110.dll:AMP項目的運行時庫

在您的計算機上,您還獲得了這些DLL的調試版本,並由VS安裝程序復制到Windows目錄中。 它們具有相同的名稱,並附加字母“ d”。 僅對調試代碼有用,不能重新分發它們。 相應的運行時庫設置為/ MDd。

大多數C ++項目只需要msvcr110.dll和msvcp110.dll,當您選擇使用其他庫時就會知道,因為它們具有特定的項目模板和設置。

將所有這些DLL安裝在用戶計算機上的一種簡單方法是使用預構建的安裝程序。 您可以從此處下載(注意:僅從今天開始有效,當Service Pack或更新可用時,它可能會更改)。 或者,您可以簡單地將它們復制到與主EXE相同的目錄中。

通過將運行時庫設置更改為/ MT,可以避免依賴這些DLL。 在這種情況下,運行時支持代碼將鏈接到您的程序,並且只有一個EXE可以部署。 當您這樣做時,它當然會變大,有時會變大,尤其是在使用MFC時。

如果創建DLL和EXE,則使用/ MT會有風險。 您最終將在程序中獲得CRT的多個副本。 對於VS的早期版本尤其如此,每個CRT都有自己的堆,而VS2012則不然。 但是,例如,當您有多個“ errno”變量時,仍然會遇到難看的運行時問題。 強烈建議使用/ MD以避免這種損失。

您的程序將在Windows Vista,7和8上運行。對XP的支持正在減弱,您將需要VS Update 1並將項目中的工具集設置從“ v110”更改為“ v110_xp”,以創建仍可在XP上運行的程序。 這樣做會丟失某些功能,並且與語言環境和線程本地存儲相關聯,因此需要進行測試。

這里什么都沒有...如果發現錯誤,請輸入提示音。

1.“ C / C ++運行時庫”和“ C / C ++標准庫”之間有區別嗎?

是的,沒有。 有時人們使用運行時庫來表示所有內容,而完全忽略標准庫(對於Microsoft工具)。 但是,從技術上講,運行時庫是在運行時加載的,因此它包括.lib(導入lib)和.dll對。 有關詳細信息,請參見此處: http : //msdn.microsoft.com/zh-cn/library/vstudio/abx4dbyh(v=vs.100).aspx

從技術上講,libc *是標准庫,而* crt是運行時庫。

2.如何知道“ C / C ++運行時庫”庫是靜態鏈接還是動態鏈接到項目?

如果您使用的是IDE(VS2010,其他類似),則在項目屬性中:

-  configuration properties
        - c/c++
               - code generation
                      [Runtime Library]

3.如何知道該庫在文件系統中的位置?

lib文件位於sdk(如果安裝了更高版本的Windows sdk)或Visual C ++目錄的lib目錄中。

4.如果“ C / C ++運行時庫”是動態鏈接到項目的,我如何知道使用了哪個“ .dll”以及文件系統中所使用的“ .dll”位於何處?

您可以使用“依賴”工具找出使用了哪些工具。 http://www.dependencywalker.com/

DLL位於Windows目錄中的某個位置。 他們四處移動它們,現在它位於帶有清單和材料的時髦地方,以跟蹤版本。 我不會為此擔心太多。 如果您必須為此擔心,那可能是錯誤的。 有關詳細信息: http : //msdn.microsoft.com/zh-cn/library/windows/desktop/aa375365( v = vs.85).aspx http://en.wikipedia.org/wiki/Side-by-side_assembly

如果這是一個問題,則可以將可再發行軟件包與安裝程序捆綁在一起: Visual Studio可再發行與Visual Studio SP1之間的區別

5.假設我將“ C / C ++運行時庫”靜態鏈接到項目,可以確定從源代碼生成的可執行文件將在所有Windows平台(XP / Vista / Seven / ...,32位)上都可以運行/ 64位)?

是的,如果您靜態鏈接,則在無法找到dll方面更安全。 但是,這會使您的可執行文件更大。 在行為方面還有其他后果……很難一一列舉,但區別在於該庫位於dll中,而編譯為您的exe。

6.將“ C / C ++運行時庫”動態鏈接到項目的優點/缺點是什么?

為什么要使用dll:

一個-大小。 較小的exe大小,因為所有庫文件都位於dll中,這應該已經在用戶的系統上安裝了,盡管有時並非如此。

b-如果運行時存在錯誤,Microsoft可以將新版本下推給用戶。 您不必處理它。 如果您靜態鏈接,則必須向用戶推送新的exe。

為什么不使用dll:

一個-處理dll的許多問題。 如果您忘記捆綁重做器,則會出現許多問題。

b-加載和卸載更多dll會導致啟動和退出時間變慢。

我可能沒有想到的其他原因...

7.應該將“ C / C ++運行時庫”靜態還是動態鏈接到項目?

真的要看 我個人更喜歡靜態鏈接。 我討厭到處尋找合適的redist / dll / etc。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM