Visual C++ 編譯器選項 /MD、/ML、/MT、/LD

前段時間編譯一個引用自己寫的靜態庫的程序時老是出現鏈接時的多個重定義的錯誤,而自己的代碼明明沒有重定義這些東西,譬如:
LIBCMT.lib(_file.obj) : error LNK2005: ___initstdio already defined in libc.lib(_file.obj)
LIBCMT.lib(_file.obj) : error LNK2005: ___endstdio already defined in libc.lib(_file.obj)
LIBCMT.lib(_file.obj) : error LNK2005: __cflush already defined in libc.lib(_file.obj)
LIBCMT.lib(_file.obj) : error LNK2005: __iob already defined in libc.lib(_file.obj)
LIBCMT.lib(osfinfo.obj) : error LNK2005: __alloc_osfhnd already defined in libc.lib(osfinfo.obj)
LIBCMT.lib(osfinfo.obj) : error LNK2005: __set_osfhnd already defined in libc.lib(osfinfo.obj)
LIBCMT.lib(osfinfo.obj) : error LNK2005: __free_osfhnd already defined in libc.lib(osfinfo.obj)
LIBCMT.lib(osfinfo.obj) : error LNK2005: __get_osfhandle already defined in libc.lib(osfinfo.obj)
LIBCMT.lib(osfinfo.obj) : error LNK2005: __open_osfhandle already defined in libc.lib(osfinfo.obj)
LIBCMT.lib(tolower.obj) : error LNK2005: __tolower already defined in libc.lib(tolower.obj)
LIBCMT.lib(tolower.obj) : error LNK2005: _tolower already defined in libc.lib(tolower.obj)
等等。

所 以初步估計是編譯器的問題,通過網上搜索和查看msdn,原來是Visual C++ 編譯器選項的關于單線程或多線程運行時例程的問題:我的那個靜態庫編譯時/ML單線程版本的,而引用它的程序是/MT多線程版本的,他們在編譯分別講 libc.lib和LIBCMT.lib連接到各自的代碼中,估計libc.lib和LIBCMT.lib只是單線程與多線程的區別,基本代碼相差無幾, 所以會產生鏈接時重定義錯誤;然后把編譯靜態庫的選項/ML改成/MT就沒事了。

要注意的是:/MD也是多線程版本的;被應用的用戶鏈接庫 要和應用者有相同的編譯選項,/MD與/MT一起有時候會有錯誤的,有時候就沒有,我試過這種情況;而/MD和/ML似乎是沒有問題的;/MT和/ML是 肯定會有問題的。有沒有其他情況就不清楚了,有興趣的可以測試一下,^_^

如果是代碼是用于多線程的,最好編譯成多線程版本的,否則可能會出現一些意想不到的問題。

編譯器選項設置(vc6):工程 -> 設置 -> C/C++ -> 工程選項 里可以修改
附:
下面是msdn關于Visual C++ 編譯器選項的說明:

這些選項選擇單線程或多線程運行時例程,指示多線程模塊是否為 DLL,并選擇運行時庫的發布版本或調試版本。

選項說明
/MD定義 _MT 和 _DLL 以便同時從標準 .h 文件中選擇運行時例程的多線程特定版本和 DLL 特定版本。此選項還使編譯器將庫名 MSVCRT.lib 放入 .obj 文件中。用此選項編譯的應用程序靜態鏈接到 MSVCRT.lib。該庫提供允許鏈接器解析外部引用的代碼層。實際工作代碼包含在 MSVCR71.DLL 中,該庫必須在運行時對于與 MSVCRT.lib 鏈接的應用程序可用。當 在定義了 _STATIC_CPPLIB (/D_STATIC_CPPLIB) 的情況下使用 /MD 時,它將導致應用程序通過靜態多線程標準 C++ 庫 (libcpmt.lib) 而非動態版本 (msvcprt.lib) 進行鏈接,同時仍通過 msvcrt.lib 動態鏈接到主 CRT。
/MDd定義 _DEBUG、_MT 和 _DLL,以便從標準 .h 文件中選擇運行時例程的調試多線程特定版本和 DLL 特定版本。它還使編譯器將庫名 MSVCRTD.lib 放入 .obj 文件中。
/ML使編譯器將庫名 LIBC.lib 放入 .obj 文件中,以便鏈接器使用 LIBC.lib 解析外部符號。這是編譯器的默認操作。LIBC.lib 不提供多線程支持。
/MLd定義 _DEBUG 并使編譯器將庫名 LIBCD.lib 放入 .obj 文件中,以便鏈接器使用 LIBCD.lib 解析外部符號。LIBCD.lib 不提供多線程支持。
/MT定義 _MT, 以便從標準頭 (.h) 文件中選擇運行時例程的多線程特定版本。此選項還使編譯器將庫名 LIBCMT.lib 放入 .obj 文件中,以便鏈接器使用 LIBCMT.lib 解析外部符號。創建多線程程序需要 /MT 或 /MD(或它們的調試等效選項 /MTd 或 /MDd)。
/MTd定義 _DEBUG 和 _MT。定義 _MT 會導致從標準 .h 文件中選擇運行時例程的多線程特定版本。此選項還使編譯器將庫名 LIBCMTD.lib 放入 .obj 文件中,以便鏈接器使用 LIBCMTD.lib 解析外部符號。創建多線程程序需要 /MTd 或 /MDd(或它們的非調試等效選項 /MT 或 MD)。
/LD創建 DLL。將 /DLL 選項傳遞到鏈接器。鏈接器查找 DllMain 函數,但并不需要該函數。如果沒有編寫 DllMain 函數,鏈接器將插入返回 TRUE 的 DllMain 函數。鏈接 DLL 啟動代碼。如果命令行上未指定導出 (.exp) 文件,則創建導入庫 (.lib);將導入庫鏈接到調用您的 DLL 的應用程序。將 /Fe 解釋為命名 DLL 而不是 .exe 文件;默認程序名成為基名稱.dll 而不是基名稱.exe。如果還未顯式指定 /M 選項之一,則將默認運行時庫支持更改為 /MT。
/LDd創建調試 DLL。定義 _DEBUG。

警告 不要混合使用運行時庫的靜態版本和動態版本。在一個進程中有多個運行時庫副本會導致問題,因為副本中的靜態數據不與其他副本共享。鏈接器禁止在 .exe 文件內部既使用靜態版本又使用動態版本鏈接,但您仍可以使用運行時庫的兩個(或更多)副本。例如,當與用動態 (DLL) 版本的運行時庫鏈接的 .exe 文件一起使用時,用靜態(非 DLL)版本的運行時庫鏈接的動態鏈接庫可能導致問題。(還應該避免在一個進程中混合使用這些庫的調試版本和非調試版本)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448253.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448253.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448253.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Delphi面向對象編程的20條規則

Delphi面向對象編程的20條規則 作者簡介 Marco Cantu是一個知名的Delphi專家,他曾出版過《精通Delphi》系列叢書,《Delphi開發手冊》以及電子書《精通Pascal》(該電子書可在網上免費獲得)。他講授的課題是Delphi基礎和高級開發技巧。你可以通過他…

制動失靈怎么辦?

定義 制動過程中,由于制動器某些零部件的損壞或發生故障,使運動部件(或運動機械)不能保持停止狀態或不能按要求停止運動的現象。 制動失靈的原因 制動失靈的關鍵在于制動系統無法對汽車施加足夠的制動力,包括制動液管路液位不足或進入空氣、制…

OpenDDS用idl生成自定義數據類型時遇到的一個問題

問題:這里會提示LNK2005重復定義的錯誤 解決方案: 解決后:

解決:Connect to xx.xx.xxx.xx :8081 [/xx.xx.xx.xx] failed: Connection refu sed: connect -> [H

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 自行啟動了個 Nenux 服務。想把本地工程推送到 個人私服,執行命令:mvn deploy 報錯: Failed to…

ADOQuery 查詢 刪除 修改 插入

//利用combobox組件查詢數據庫表procedure TForm1.Button1Click(Sender: TObject);beginADOQuery1.Close;ADOQuery1.SQL.Clear;ADOQuery1.SQL.Add(select * from trim(ComboBox2.Text));ADOQuery1.Active:true;end; //查詢記錄procedure TForm1.Button1Click(Sender…

防爆胎,有妙招

對于大多數人來說,買車難,養車更難。許多人擁有了新車,卻沒有足夠的知識去好好保養汽車,這實在是非常可惜。如何做好汽車的保養工作,讓我們的愛車更好的為我們工作?夏天熾熱的天氣,是否讓你為爆胎煩惱不已?…

Qt之QProcess(一)運行cmd命令

Qt提供了QProcess類,QProcess可用于完畢啟動外部程序,并與之交互通信。 一、啟動外部程序的兩種方式: (1)一體式:void QProcess::start(const QString & program, const QStringList & arguments…

Docker 方式安裝 Nexus 私服

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 從Docker 官方倉庫查找鏡像: docker search nexus 2. 拉取鏡像: docker pull 你選中的鏡像的名字  pull…

shader飛線改進版

項目github地址:https://github.com/ecojust/flyline 前面寫過一個飛線(基于THREE.Line進行的顏色變化),只是簡單地將可視區片元顏色的alpha通道值設為1.0,不在可視區的設為0.0。效果是這樣的: 做得很粗糙,而且因為線是…

轉向盤失控怎么辦?

定義 轉向失控就是方向盤不管用了,打方向盤,但是前輪不動,不受方向盤控制。 轉向失控的原因 轉向失控可能因為車輛過快、酒駕、疲勞、車況不佳、雨雪路滑等,還有轉向機構中有零部件脫落、損壞、卡滯時,也會使轉向機構突…

Socket網絡編程【獲取本機IP】

//12.3.2//運行環境VS2013//獲取本地IP #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib")void main() { // 調用WSAStarup初始化WINsock庫 WSADATA wsaData; ::WSAStartup( MAKEWORD(2,2), &wsaData);// 存放主機名的…

onresize

1 window.onresize function (ev) { 2 console.log(尺寸發生改變&#xff01;); 3 }; 4 5 window.addEventListener(resize, function (ev) { 6 console.log(尺寸發生改變&#xff01;); 7 }); 1 /*2 當屏幕的寬度>960時&#xff0c;頁面的背景顏色為紅色…

Vuejs:組件 slot 內容分發

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 本文是在官方文檔的基礎上&#xff0c;更加細致的說明&#xff0c;代碼更多更全。 簡單來說&#xff0c;更適合新手閱讀 &#xff08;…

C++獲取本機所有ip地址,可區分類型是有線無線虛擬機還是回環

一個小程序&#xff0c;可以獲取本地所有ip地址&#xff0c;包括有線&#xff0c;無線&#xff0c;虛擬機&#xff0c;環回接口網卡&#xff0c;等。 如圖&#xff0c;一臺機器多個網卡&#xff1a; 程序執行結果&#xff1a; #include"stdio.h" #include"…

頓悟人生十一句話

一、永遠不要埋怨你已經發生的事情 如果你打算忍受一件事情就閉上嘴巴吧。要么就改變它&#xff0c;要么就安靜的接受它。 二、最讓你忿忿不平的問題&#xff0c;就是你需要解決的問題 一個被酒后駕駛的司機撞死自己兒子的婦女&#xff0c;發起了反對酒后駕駛母親協會…

Mybatis 在 IDEA 中使用 generator 逆向工程生成 pojo,mapper

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 使用mybatis可以逆向生成pojo和mapper文件有很多種方式&#xff0c;我以前用的是mybtais自帶的generator包來生成&#xff0c;連接如下&…

控制臺程序隱藏方法總結(四種)

學習計算機&#xff0c;往往先從Windows環境下學習編程&#xff0c;學習編程&#xff0c;往往從C學起&#xff0c;學習C&#xff0c;往往又從控制臺程序學習&#xff0c;何為控制臺&#xff0c;就是那個黑框白字的界面。對于這樣一個最初認為奇陋無比而現在認為無所不能的編程平…

十大教養,讓你氣度非凡!

01.守時 無論是開會、赴約&#xff0c;有教養的人從不遲到。他們懂得&#xff0c;即使是無意遲到&#xff0c;對其他準時到場的人來說&#xff0c;也是不尊重的表現。 02.談吐有節 注意從不隨便打斷別人的談話&#xff0c;總是先聽完對方的發言&#xff0c;然后再去反駁或者補…

mybatis :Criteria 查詢、條件過濾用法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 PS&#xff1a;hibernate 中也有 Criteria 的用法&#xff0c;見另一文章&#xff1a;jpa : criteria 作排除過濾、查詢 1. 包&#xf…

C++11多線程----線程管理

說到多線程編程&#xff0c;那么就不得不提并行和并發&#xff0c;多線程是實現并發&#xff08;并行&#xff09;的一種手段。并行是指兩個或多個獨立的操作同時進行。注意這里是同時進行&#xff0c;區別于并發&#xff0c;在一個時間段內執行多個操作。在單核時代&#xff0…