靜態編譯為什麼用md
㈠ 易語言編譯器中的 (靜態編譯) 有什麼作用
用靜態編譯它會把支持庫文件和EXE程序一起打包,編譯出來的EXE程序可以在沒有裝易語言的電腦中運行。如果不是靜態編譯他會把支持庫文件和EXE分離開,如果失去支持文件EXE程序就無法在沒有裝易語言的電腦中運行。
㈡ VS運行時 /MD,/MDd 和 /MT,/MTd之間的區別
在一個項目中需要用到OpenCV,剛開始使用了OpenCV的動態鏈接庫,這樣,在移動可執行程序時還必須將OpenCV動態支持庫一起搬移,很是麻煩。所以,最終選擇OpenCV靜態鏈接庫,這樣程序移植運行就方便了很多。
需要編譯成靜態庫以便於應用程序鏈接。
網上有的教程中寫的在VC++2011下安裝OpenCV2.1時用到了TBB庫,而我在編譯鏈接自己的程序後需要用到TBB.dll。本人設計的目的就是要做一個獨立的界面程序,不需要攜帶其他第三方庫。經過一段時間的努力最終找到了編譯OpenCV2.1靜態庫的方法。
需要的工具環境及文件:
-------------------------------------------------------------------------------------------------------------
1、Windows XP
2、VC++2011(VS2011)
3、為編譯OpenCV源碼包(我下載的有:OpenCV2.1.0,OpenCV2.3.0及OpenCV2.4.4)
4、CMake2.8.9
說明:OpenCV各版本官方下載地址:opencv.org/
cmake-2.8.9下載地址:ishare.iask.sina.com.cn/download/explain.php?fileid=35025936
--------------------------------------------------------------------------------------------------------------
以OpenCV2.1.0編譯靜態庫為例
CMake配置
-------------------------------------------------------------------------------------------------------------
打開CMake並設置:
Where is the rource code :OpenCV源代碼所在的文件夾
Where to build the binaries:CMake配置好得到的文件放在位置(我的:E:\OpenCV2.1.0-prj)
然後點擊configure,選擇"Visual Studio 10"。然後確定。
等待configure完成,會出現很多紅色的選項,因為主要是生成OpenCV的庫,所以只需保留某些選項:
去掉BUILD_NEW_PYTHON_SUPPORT,BUILD_SHARED_LIBS, BUILD_TESTS
勾選OPENCV_BUILD_3RDPARTY_LIBS, WITH_TBB,WITH_JASPER, WITH_JPEG,
WITH_PNG, WITH_TIFF選項,
然後再點擊configure,如下圖:
提示TBB_INCLUDE_DIR找不到,因為我們不需要TBB庫,所以忽略,再一次點擊configure。
等待配置完成,最後點擊generate,完成後關閉CMake。
-------------------------------------------------------------------------------------------------------------
VC++2011編譯靜態庫
-------------------------------------------------------------------------------------------------------------
進入E:\OpenCV2.1.0-prj目錄,使用VC++2011打開.sln文件,打開項目管理器
這時候會看到
解決方案中有很多小項目存在。
註:這時我們右鍵任意點擊一個子項目(如cv),選擇屬性,可以在配置屬性下的常規項目中看到,配置類型為
靜態庫(lib)。
按住ctrl鍵,選中除過ALL_BUILD, INSTALL, ZERO_CHECK,
uninstall四個項目的其他所有項目,在菜單中選擇項目->屬性,打開配置屬性->c/c++->代碼生成選項,在右側窗口中的運行時庫中選擇多線程調試(/MTd),然後確認。
說明:這里有四個選項(/MT, /MTd, /MD,
/MDd),前兩個一組,為靜態鏈接運行時庫,運行時不需要運行時庫的支持,代碼直接插入到程序中去;後兩個一組,為動態鏈接運行時庫,運行時需要msvcr90.dll或msvcp90.dll支持。
我們先編譯Debug版的OpenCV靜態庫,在解決方案"opencv"(22個項目)上單擊右鍵,選擇重新生成解決方案,此時便開始編譯OpenCV庫了,等編譯結束會提示完成16個,失敗4個:
這四個項目生成的是exe程序,不需要管他們。到這步我們已經生成了Debug版本的靜態庫!
然後我們用相同的方式生成Release版的庫,在之前的基礎上只需要將選項選擇多線程/MT,再進行編譯。編譯時警告很多,直接忽略!
注意:/MT即是Release版本,/MTD即是Debug版本。
最終我們需要的靜態庫就存在:E:\OpenCV2.1.0-prj/lib 和 E:\OpenCV2.1.0-prj/3rdparty/lib
兩個目錄,我們編譯好的庫就在這兩個文件夾下。分別
將E:\OpenCV2.1.0-prj/3rdparty/lib中Debug
下面的所有文件Copy到E:\OpenCV2.1.0-prj/lib中的Debug 文件中。
將E:\OpenCV2.1.0-prj/3rdparty/lib中Release下面的所有文件Copy到E:\OpenCV2.1.0-prj/lib中的Release文件中。
㈢ gcc 的編譯選項 -MD 是什麼意思
MD 是一個參數.
gcc提供了大量的警告選項,對代碼中可能存在的問題提出警 告,通常可以使用-Wall來開啟以下警告:
-Waddress -Warray-bounds (only with -O2) -Wc++0x-compat
-Wchar-subscripts -Wimplicit-int -Wimplicit-function-declaration
-Wcomment -Wformat -Wmain (only for C/ObjC and unless
-ffreestanding) -Wmissing-braces -Wnonnull -Wparentheses
-Wpointer-sign -Wreorder -Wreturn-type -Wsequence-point
-Wsign-compare (only in C++) -Wstrict-aliasing -Wstrict-overflow=1
-Wswitch -Wtrigraphs -Wuninitialized (only with -O1 and above)
-Wunknown-pragmas -Wunused-function -Wunused-label -Wunused-value
-Wunused-variable
unused-function:警告聲明但是沒有定義的static函數;
unused- label:聲明但是未使用的標簽;
unused-parameter:警告未使用的函數參數;
unused-variable:聲明但 是未使用的本地變數;
unused-value:計算了但是未使用的值;
format:printf和scanf這樣的函數中的格式字元 串的使用不當;
implicit-int:未指定類型;
implicit-function:函數在聲明前使用;
char- subscripts:使用char類作為數組下標(因為char可能是有符號數);
missingbraces:大括弧不匹配;
parentheses: 圓括弧不匹配;
return-type:函數有無返回值以及返回值類型不匹配;
sequence-point:違反順序點的代碼,比如 a[i] = c[i++];
switch:switch語句缺少default或者switch使用枚舉變數為索引時缺少某個變數的case;
strict- aliasing=n:使用n設置對指針變數指向的對象類型產生警告的限製程度,默認n=3;只有在-fstrict-aliasing設置的情況下有 效;
unknow-pragmas:使用未知的#pragma指令;
uninitialized:使用的變數為初始化,只在-O2時有 效;
㈣ 為什麼MFC 對話框工程不能設置 /MT選項必須設置成MD(VS2005)
㈤ 【緊急】C sharp 怎樣「靜態編譯」Windows應用窗口程序
1.靜態編譯QT,使程序可以將靜態庫的形式使用QT,這個好辦,在configure.exe 程序的參數下,給上-static參數即可。
2.QT使用了VC的鏈接庫也要靜態鏈接。這個就有點難辦了,因為QT默認的使用方式是動態的,不過,有了前人的研究就好辦了,打開<qt-
install-dir>\mkspecs\win32-msvc2005\qmake.conf文件(VS2005,如果是VC6,則是<qt-install-dir>\mkspecs\win32-msvc\qmake.conf,
VS2003:<qt-install-dir>\mkspecs\win32-msvc.net\qmake.conf,相信現在沒有人用VS2002吧),將下面兩行:
QMAKE_CFLAGS_RELEASE = -O2 -MD
QMAKE_CFLAGS_DEBUG = -Zi -MDd
改為:
QMAKE_CFLAGS_RELEASE = -O2 -MT
QMAKE_CFLAGS_DEBUG = -Zi -MTd
就好了。這是VS2005的示例,如果你是其他版本的VS,則會有些區別,但只要將MD(動態)改為MT(靜態),將MDD(動態調試)改為MTD(靜
態調試),就好了。
如果你有多個版本的VS安裝在系統上,則在configure.exe的命令行參數給上-platform win32-msvc2005,就可以使用VS2005編譯了,其他的VS
版本可以在README中找到:
win32-g++
win32-icc (commercial edition only)
win32-msvc (commercial edition only)
win32-msvc.net (commercial edition only)
win32-msvc2005 (commercial edition only)
改好了,就可以用 configure -platform win32-msvc2005 -debug-and-release -static -fast -qt-sql-sqlite 來配置系統了。
㈥ 如何判斷一個lib是用/ mt還是/ md編譯的
VS2008,項目——屬性——配置屬性——C/C++——代碼生成:他有/MT,/MTd,/Md,/MDd四個選項,你必須讓所有使用的庫都使用相同的配置,否則就會有相應的提示,甚至可能會出現無法解析的函數。有時我們使用的庫不是自己可以控制的,那麼就只能把工程屬性設置成河你使用的庫相同的選項。
錯誤 1 error LNK2005: _free 已經在 libcmtd.lib(dbgheap.obj) 中定義 MSVCRT.lib
錯誤 2 error LNK2005: _malloc 已經在 libcmtd.lib(dbgheap.obj) 中定義 MSVCRT.lib
.....
如果有一堆的重定義錯誤發生在同一個lib中,而且跟它沖突的也是同一個lib,那麼這個兩個lib的功能應該是一樣的,可以2選一,只要在「忽略特定的庫」內填入需要忽略的庫。
項目屬性-配置屬性-鏈接器-輸入-忽略特定的庫:libcmtd.lib
項目屬性-配置屬性-常規-MFC的使用:在共享 DLL 中使用 MFC
MSVCRT.lib 和libcmt.lib的沖突還是比較常見的。
從錯誤信息可以看出是msvcrt.lib和libcmt.lib庫中重復定義了__isctype等符號。為什麼會出現這樣的問題呢?這就要從這兩個庫的作用說起了。
msvcrt.lib是VC中的Multithreaded DLL 版本的C運行時庫,而libcmt.lib是Multithreaded的運行時庫。在同一個項目中,所有的源文件必須鏈接相同的C運行時庫。如果某一文 件用了Multithreaded DLL版本,而其他文件用了Single-Threaded或者Multithreaded版本的庫,也就是說用了不同的庫,就會導致這個警告的出現。
告警信息的意思我們明白之後,就要找造成這個問題的原因了。在項目設置中我們可以看到當前項目使用的是Multithreaded非DLL版本的運 行時庫,這說明項目中還有其他文件用到了不是這個版本的運行時庫。很顯然,就是openssl的靜態庫。查看openssl中ms下的nt.mak,我們 可以發現靜態庫版本中openssl使用編譯開關/MD進行編譯的,也就是說openssl靜態庫是默認用的Multithreaded DLL 版本的C運行時庫。
原因找到了。那麼解決方法,很明顯有兩個。總之就是將兩個項目的運行時庫統一。
簡單的方式就是將項目的動態庫修改為使用Multithreaded DLL 版本的C運行時庫即可。
某些情況下你的項目可能不能改變當前的運行時庫,你可以將openssl的nt.mak中的/MD開關修改為/MT然後重新編譯openssl靜態庫就可以了。
默認庫「library」與其他庫的使用沖突;請使用 /NODEFAULTLIB:library LNK4098 的解決辦法
您試圖與不兼容的庫鏈接。
注意
運行時庫現在包含可防止混合不同類型的指令。如果試圖在同一個程序中使用不同類型的運行 時庫或使用調試和非調試版本的運行時庫,則將收到此警告。例如,如 果編譯一個文件以使用一種運行時庫,而編譯另一個文件以使用另一種運行時庫(例如單線程運行時庫對多線程運行時庫),並試圖鏈接它們,則將得到此警告。應 將所有源文件編譯為使用同一個運行時庫。有關更多信息,請參見使用運行時庫(/MD、/MT 和 /LD)編譯器選項。
可以 使用鏈接器的 /VERBOSE:LIB 開關來確定鏈接器搜索的庫。如果收到 LNK4098,並想創建使用如單線程、非調試運行時庫的可執行文件,請使用 /VERBOSE:LIB 選項確定鏈接器搜索的庫。鏈接器作為搜索的庫輸出的應是 LIBC.lib,而非 LIBCMT.lib、MSVCRT.lib、LIBCD.lib、LIBCMTD.lib 和 MSVCRTD.lib。對每個要忽略的庫可以使用 /NODEFAULTLIB,以通知鏈接器忽略錯誤的運行時庫。
㈦ md編譯 什麼情況下確實dll
1、為什麼選擇/MD,不選/MT?
(1)程序就不需要靜態鏈接運行時庫,可以減小軟體的大小;
(2)所有的模塊都採用/MD,使用的是同一個堆,不存在A堆申請,B堆釋放的問題。
2、為什麼選擇/MT,不選擇/MD?
(1)有些系統可能沒有程序所需要版本的運行時庫,程序必須把運行時庫靜態鏈接上。
3、多個模塊,必須選擇相同類型的運行時庫,不要混合使用。
三、選擇/MT需要解決的堆空間釋放問題
不同的模塊各自有一份C運行時庫代碼,各個C運行庫會有各自的堆,導致了各個模塊會有各自的堆。如果在A堆中申請空間,到B堆中釋放就會有崩潰,在模塊A申請的空間,必須在模塊A中釋放。
附件(下載地址:http://files.cnblogs.com/cswuyg/Test_MD_and_MT.rar)的DLL以及DLLUser代碼,以STL的string為例,通過修改編譯選項驗證了這個問題。(string在賦值的時候需要釋放掉原來的空間,然後再申請新的空間存儲新的內容。)