1. 程式人生 > >VS的執行時庫(Runtime lIB)

VS的執行時庫(Runtime lIB)

在開發window程式是經常會遇到編譯好好的程式拿到另一臺機器上面無法執行的情況,這一般是由於另一臺機器上面沒有安裝響應的執行時庫導致的,那麼這個與編譯選項MT、MTd、MD、MDd有什麼關係呢?這是msdn上面的解釋:

MT:mutithread,多執行緒庫,編譯器會從執行時庫裡面選擇多執行緒靜態連線庫來解釋程式中的程式碼,即連線LIBCMT.lib庫

MTd:mutithread+debug,多執行緒除錯版,連線LIBMITD.lib庫

MD:MT+DLL,多執行緒動態庫,連線MSVCRT.lib庫,這是個匯入庫,對應動態庫為MSVCRT.dll

MDd: MT+DLL+debug,多執行緒動態除錯庫,連線MSVCRTD.lib庫,對應動態庫為MSVCRTD.dll

開發多執行緒程式時(單執行緒本文不做討論),需要選擇MT、MTd、MD、MDd其中的一個。

對於MT/MTd,由於連線執行時庫是LIBCMT.lib/LIBCMTD.lib,這兩個庫是靜態庫,所以此種方式編譯的程式,移到另一臺機器上面也可以正常執行。

但是對於MD/MDd,連線的是動態庫,所以如果另一臺機器上沒有MSVCRT.dll/MSVCRTD.dll時,就提示缺少動態庫這樣的錯誤。

曾經犯這樣的錯誤,以為以MT/MTd方式編譯,程式對所有的庫都是靜態連結的,其實錯了,它只能決定執行時庫是動態連結還是靜態連結,對使用者自己寫的庫或其他第三方庫,其連線方式取決於程式碼(顯示連線動態庫Loadlibrary)或所提供的lib檔案(為匯入庫還是靜態庫),移動程式到別的機器上時,還是要帶上所需要的動態庫的。

來看一個例子,編譯一個靜態庫和一個動態庫,均實現兩個整數相加的功能:

// adds.h
// add後面加個s代表靜態庫
#pragma once
int add(int,int);
// adds.cpp
// 靜態庫
#include "adds.h"
int add(int a, int b)
{
    return a+b;
}

以上,執行時庫選擇MTd,編譯成靜態庫adds.lib

// addd.h
// add後面加d代表動態庫
#pragma once
#ifndef MYLIB_API
#define MYLIB_API _declspec(dllexport)
#endif
MYLIB_API int
add(int,int); // addd.cpp // 動態庫 #include "addd.h" int add(int a, int b) { return a+b; }

以上,執行時庫選擇MTd,編譯成動態庫addd.lib, addd.dll

```
// test.cpp
// 測試程式
#include <iostream>

// 測試靜態庫,此處為1,測試動態庫,此處為0
#define TEST_STATIC_LINK 1

#if TEST_STATIC_LINK 
  #include <adds.h>
#else
  #define MYLIB_API _declspec(dllimport)

#include “addd.h”

endif

using namespace std;

int main()
{
cout << add(2,3) << endl;
return 0;
}

測試程式以MTd編譯
複製程式碼
1. 測試靜態庫,TEST_STATIC_LINK 定義為1,提供adds.lib,生成可執行檔案,移動到另一臺機器上可以執行,因為測試程式和adds.lib均靜態連線執行時庫

  1. 測試動態庫,TEST_STATIC_LINK 定義為0,提供addd.lib,生成可執行檔案,移動到另一臺機器上可以執行,但需要addd.dll,因為addd庫靜態連線執行時庫,測試程式靜態連線執行時庫,動態連線addd庫

在上面的例子中add庫和測試程式均選擇MTd執行時庫,若不一致會導致一些編譯連線錯誤,讓新手不著頭腦。

比如adds選擇MDd,連線將會出現這樣的錯誤:

1>正在連結…

1>MSVCRTD.lib(ti_inst.obj) : error LNK2005: “private: __thiscall type_info::type_info(class type_info const &)” ([email protected]@[email protected]@@Z) 已經在LIBCMTD.lib(typinfo.obj) 中定義

1>MSVCRTD.lib(ti_inst.obj) : error LNK2005: “private: class type_info & __thiscall type_info::operator=(class type_info const &)” ([email protected]@[email protected]@@Z) 已經在LIBCMTD.lib(typinfo.obj) 中定義

即一個程式中混合了不同的執行時庫(靜態庫和動態庫,除錯庫和非除錯庫),可能會產生衝突,所以一個程式中應該使用相同的執行時庫。

相關推薦

VS執行Runtime lIB

在開發window程式是經常會遇到編譯好好的程式拿到另一臺機器上面無法執行的情況,這一般是由於另一臺機器上面沒有安裝響應的執行時庫導致的,那麼這個與編譯選項MT、MTd、MD、MDd有什麼關係呢?這是msdn上面的解釋: MT:mutithread,多執行緒庫

關於執行異常Runtime Exception和受檢查的異常(Checked Exception)以及系統異常和普通異常的一些總結

Exception 表示程式還能夠克服和恢復的問題,Exception 類又分為執行時異常(Runtime Exception)和受檢查的異常(Checked Exception),所謂執行時異常就是開發人員編寫程式碼時不會報紅,但是執行不得當的話會執行出錯,也

[執行]Objective-C的執行程式設計Runtime Programming

以前還真沒了解過Objective-C的執行時程式設計(Runtime Programming),今天特意在網上搜了下,原來這麼深奧啊 表示現在理解不了,先轉走了再說,之前轉載的文章都是大神們總結的綜合,轉載地址忘記註明了 ,抱歉。 --  [1] 版本和平臺   -

iOS開發之執行程式設計Runtime Programming淺讀

  什麼是執行時(Objective-C runtime)?       簡單的來說,Objective-C runtime是一個實現 Objective-C語言的庫。物件可以用C語言的結構體表示,而方法(methods) 可以用C函式實現。       事實上,他們也差不

C執行C Run-time Library詳解

一、什麼是C執行時庫1)C執行時庫就是 C run-time library,是 C 而非 C++ 語言世界的概念:取這個名字就是因為你的 C 程式執行時需要這些庫中的函式.2)C 語言是所謂的“小核心”語言,就其語言本身來說很小(不多的關鍵字,程式流程控制,資料型別等);所以,C 語言核心開發出來之後,De

Visual Studio 2017 動態鏈接DLL /LIB 靜態鏈接(LIB)的思考

imp 動態 -o ffffff library code mic mage .org 軟件工程方面能夠快速的發展,我相信源代碼重用起到了不可忽略的作用。在Linux平臺下就C++而言,有以so結尾的動態鏈接庫文件,也有以.a結尾的靜態連接庫文件,這

執行異常和非執行異常一般異常的區別

一,異常的概念 Java異常類層次結構圖: Throwable: 有兩個重要的子類:Exception(異常)和 Error(錯誤),二者都是 Java 異常處理的重要子類,各自都包含大量子類。 Error(錯誤):是程式無法處理的錯誤,表示執行應用程式中較嚴重問題。大多數錯誤與程式碼編

通俗理解執行異常和非執行異常一般異常

一,異常的概念 Java異常類層次結構圖: Throwable: 有兩個重要的子類:Exception(異常)和 Error(錯誤),二者都是 Java 異常處理的重要子類,各自都包含大量子類。 Error(錯誤):是程式無法處理的錯誤,表示執行

VS執行下載地址

Microsoft Visual C++ 2008 SP1 Redistributable Package (x86) 地址:http://www.microsoft.com/en-us/download/details.aspx?id=5582 Microsoft Vi

CRTC Runtime Library—— C/C++執行

C runtime library(part of the C standard library) 任何一個 C 程式,它的背後都有一套龐大的程式碼來進行支撐,使得該程式得以執行在更高級別上,而不必擔心同計算機底層操作的細節,這套程式碼至少包括:

GCC編譯、連結、執行查詢順序最真實可信

參考了不少資料,其中最靠譜是這個:http://www.mingw.org/wiki/librarypathhowto和http://www.kaizou.org/2015/01/linux-libraries/經過線上實際驗證,GCC編譯、連結、執行時庫查詢順序如下,這個順

C/C++執行到底在Windows中起什麼作用猜想

以下是作者的一些猜想: 1. 我們在用VC程式設計時,會在執行我們的main函式前,系統先通過Kernel32呼叫一些函式,執行一些C的初始化準備工作,我們一般叫C執行時庫的初始化。那麼這些初始化的作用是什麼?是否是必要的?不知道大家有沒有思考過這個問題。 以下是我對這

C執行Visual C++ C RunTime Lib

CRT 全稱:Visual C++ C RunTime Lib 就是C執行時庫。 注: 以下內容部分引自CSDN中相關討論的帖子,並結合自己的理解整理而成。僅供參考。 1)執行時庫就是 C run-time library,是 C 而非 C++ 語言世界的概念:取這個

Qt在pro中設定執行MT、MTd、MD、MDd,只適合VS版本的Qt

轉自:http://blog.csdn.net/caoshangpa/article/details/51416077 一.在pro中設定執行時庫 最近在用Qt5.6.0(VS2013版本)呼叫一份用Visual Studio 2013編譯的Debug版本靜態庫時出現如下錯誤:

執行異常不需要捕捉與一般異常有何異同需要捕捉

Checked異常體現了Java的設計哲學:沒有完善錯誤處理的程式碼根本就不會被執行! 對於Checked異常的處理方式有兩種: A.當前方法明確知道如何處理該異常,程式應該使用try...catch塊來捕獲該異常,然後在對應的catch塊中修補該異常。 B.當前方法不知道

iOS程式設計基礎-OC-執行系統

第7章 執行時系統  7.4 動態繫結      動態繫結(dynamic binding):         是指在執行程式時(而不是在編譯時)將訊息與方法對應起來的處理過程;

VS開發】MFC執行與debug、release版本之間的配置關係

參考內容:  前段時間從網上下來一個有意思的程式碼,用VS2010開啟時需要將工程轉換為2010的工程,轉化後卻出現了編譯不通過的問題,類似這樣的錯誤:c:\program files\microsoft visual studio 10.0\vc\atlmfc\inc

vs中安裝Easyx圖形僅c++

下載EasyX圖形庫,連結http://www.easyx.cn/downloads/ 手動安裝: a.將Include資料夾中的所有標頭檔案複製到VS2012的標頭檔案目錄中,為:自己安裝目錄

執行壓縮UPX

任何檔案都是由二進位制組成的,因而只要使用合適的壓縮演算法,就可以是檔案大小進行壓縮。無失真壓縮:經過壓縮的檔案能完全恢復。如7-zip、麵包房等壓縮程式。有失真壓縮:經過壓縮的檔案不能完全恢復。壓縮多媒體檔案時大部分使用有失真壓縮。執行時壓縮器:執行時壓縮器(Run-Tim

如何理解C run-time libraryC執行)

 )執行時庫就是 C run-time library,是 C 而非 C++ 語言世界的概念:取這個名字就是因為你的 C 程式執行時需要這些庫中的函式. 2)C 語言是所謂的“小核心”語言,就其語言本身來說很小(不多的關鍵字,程式流程控制,資料型別等);所以,C 語言核心開發