九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
鏈接錯誤:msvcprtd.lib(MSVCP90D.dll) : error LNK2005

1. 現(xiàn)象:

        在MFC項目中使用 boost 庫的時候,出現(xiàn)了很多鏈接錯誤(如下)。其中 MFC項目 的配置是:

        錯誤:

                ①:msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: char const * __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::c_str(void)const " (?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ) 已經(jīng)在 async_server.obj 中定義

                ②:MSVCRTD.lib(MSVCR90D.dll) : error LNK2005: __CrtDbgReportW 已經(jīng)在 libcmtd.lib(dbgrptw.obj) 中定義

        等等,大概有接近200個類似錯誤。

2. 分析


msvcprtd.lib(靜態(tài))

LIBCMTD.lib(動態(tài))

        我們在編譯C程序時,通常要鏈接 CRT(c run-time library)。CRT可分為動態(tài)庫和靜態(tài)庫,動態(tài)庫有兩個:LIBCMTD.lib(debug版)和LIBCMT.lib(release版);靜態(tài)庫有兩個:MSVCRTD.lib(debug)和MSVCRT.lib(release)。

        而MSVC項目對應(yīng)為:

                多執(zhí)行線程調(diào)試(/MTD):LIBCMTD.lib

                多執(zhí)行線程(/MT):LIBCMT.lib

                多執(zhí)行線程調(diào)試DLL(/MDd):MSVCRTD.lib

                多執(zhí)行線程DLL(/MD):MSVCRT.lib

請注意,以上只是單純 C 語言的程序庫而沒有包含 C++ 語言在內(nèi)。如果你的程序系統(tǒng)中,有包含 C++ 語言的程序代碼的話,那又是另外一回事了。但是在項目屬性的頁面中,為什么找不到相關(guān)的設(shè)定選項呢?因為 MSVC 悄悄地幫程序設(shè)計者代勞處理掉了。只要在程序代碼中使用 #include 語法納入任何一個 C++ 的標頭文件,例如 iostream 或 fstream,MSVC 就會在鏈接器的運作階段中,自動幫我們鏈接 C++ 的執(zhí)行階段程序庫。而 C++ 的執(zhí)行階段程序庫,同樣可分為四個版本:

        靜態(tài)鏈接:LIBCPMTD.lib(Debug版本)LIBCPMT.lib

        動態(tài)鏈接:MSVCPRTD.lib(Debug版本):執(zhí)行文件相依于 MSVCP90D.dll
                            MSVCPRT.lib:執(zhí)行文件相依于 MSVCP90.dll

        至于程序執(zhí)行文件使用的是靜態(tài)鏈接或者動態(tài)鏈接的版本,就仰賴于 C 語言的版本設(shè)定選項了。舉個例子來說,如果你撰寫了一個 Debug 組態(tài)的 C++ 程序,并且保留項目原先預(yù)設(shè)的生成選項(動態(tài)鏈接),那么最終生成出來的程序執(zhí)行文件將會相依于 MSVCR90D.dll 以及 MSVCP90D.dll 兩個 DLL 文件。如果將相同的程序以 Release 組態(tài)生成完成,則會相依于MSVCR90.dll 以及 MSVCP90.dll 二者。

        出現(xiàn)這些是因為程序同時鏈接了 LIBCMTD.lib與MSVCRTD.lib而造成函數(shù)定義版本沖突。也就是說,程序鏈接器已經(jīng)在其中一個 CRT的版本中找到所需的函數(shù)定義,但此時卻又跳出另外一位 CRT,也給了一份相同函數(shù)的實現(xiàn)版本,所以鏈接器無法判斷應(yīng)該忽略誰并且選擇誰。而這個狀況的發(fā)生原因,就是你的程序與程序所鏈接的外部程序庫,使用了不同的 CRT版本之故。當時我在編譯 boost 庫的時候選擇的選項中有 “l(fā)ink=static runtime-link=shared” ,所以生成的 lib 文件使用的是動態(tài)的 CRT ,而在上面的圖中可以看到我的 MFC 項目中使用的是靜態(tài)的CRT。所以出現(xiàn)沖突。

3. 解決辦法

        方法一:重新編譯 boost 庫,采用 runtime-link=static 來編譯。也就是說,你使用的第三方庫必須編譯時使用的是靜態(tài)運行時庫。

        方法二:將上面的 “MFC的使用” 選項改為“在共享 DLL 中使用 MFC”。(不推薦,可能還有其他庫錯誤)

注:如果我們想寫一個dll庫,選擇“多執(zhí)行線程調(diào)試DLL(/MDd)”,那么我們應(yīng)該使用 runtime-link=shared  編譯的靜態(tài)boost庫。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
VC運行庫版本不同導(dǎo)致鏈接.LIB靜態(tài)庫時發(fā)生重復(fù)定義問題的一個案例分析和總結(jié)
MSVC與CRT的恩怨情仇 >> 猴子靈藥 [Monkey Potion]
帶你玩轉(zhuǎn)Visual Studio
關(guān)于形如
丟失msvcp140.dll怎么辦
你所不知道的C和C++運行庫
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服