日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

默认库“LIBCMTD”与其他库的使用冲突;请使用 /NODEFAULTLIB:library

發(fā)布時(shí)間:2023/12/9 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 默认库“LIBCMTD”与其他库的使用冲突;请使用 /NODEFAULTLIB:library 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

From:?http://blog.csdn.net/pgmsoul/article/details/4203941

?以前經(jīng)常遇到這個(gè)警告信息,因?yàn)檫\(yùn)行并沒有什么問題,所以也沒深究。但是耿耿于懷那個(gè)“ 0 個(gè)錯(cuò)誤,0 個(gè)警告”的成功提示,在網(wǎng)上搜了一下。原來問題出在默認(rèn)庫的引用選擇上。

?

VS2008,項(xiàng)目——屬性——配置屬性——C/C++——代碼生成:他有/MT,/MTd,/Md,/MDd四個(gè)選項(xiàng),你必須讓所有使用的庫都使用相同的配置,否則就會(huì)有相應(yīng)的提示,甚至可能會(huì)出現(xiàn)無法解析的函數(shù)。有時(shí)我們使用的庫不是自己可以控制的,那么就只能把工程屬性設(shè)置成河你使用的庫相同的選項(xiàng)。

錯(cuò)誤?1 error LNK2005: _free 已經(jīng)在 libcmtd.lib(dbgheap.obj) 中定義???????? MSVCRT.lib

錯(cuò)誤?2?error LNK2005: _malloc 已經(jīng)在 libcmtd.lib(dbgheap.obj) 中定義???? MSVCRT.lib?

.....

?

?

如果有一堆的重定義錯(cuò)誤發(fā)生在同一個(gè)lib中,而且跟它沖突的也是同一個(gè)lib,那么這個(gè)兩個(gè)lib的功能應(yīng)該是一樣的,可以2選一,只要在“忽略特定的庫”內(nèi)填入需要忽略的庫。

?

項(xiàng)目屬性-配置屬性-鏈接器-輸入-忽略特定的庫:libcmtd.lib

項(xiàng)目屬性-配置屬性-常規(guī)-MFC的使用:在共享 DLL 中使用 MFC

?

?

MSVCRT.lib?和libcmt.lib的沖突還是比較常見的。

從錯(cuò)誤信息可以看出是msvcrt.lib和libcmt.lib庫中重復(fù)定義了__isctype等符號。為什么會(huì)出現(xiàn)這樣的問題呢?這就要從這兩個(gè)庫的作用說起了。

msvcrt.lib是VC中的Multithreaded DLL 版本的C運(yùn)行時(shí)庫,而libcmt.lib是Multithreaded的運(yùn)行時(shí)庫。在同一個(gè)項(xiàng)目中,所有的源文件必須鏈接相同的C運(yùn)行時(shí)庫。如果某一文 件用了Multithreaded DLL版本,而其他文件用了Single-Threaded或者M(jìn)ultithreaded版本的庫,也就是說用了不同的庫,就會(huì)導(dǎo)致這個(gè)警告的出現(xiàn)。

?

告警信息的意思我們明白之后,就要找造成這個(gè)問題的原因了。在項(xiàng)目設(shè)置中我們可以看到當(dāng)前項(xiàng)目使用的是Multithreaded非DLL版本的運(yùn) 行時(shí)庫,這說明項(xiàng)目中還有其他文件用到了不是這個(gè)版本的運(yùn)行時(shí)庫。很顯然,就是openssl的靜態(tài)庫。查看openssl中ms下的nt.mak,我們 可以發(fā)現(xiàn)靜態(tài)庫版本中openssl使用編譯開關(guān)/MD進(jìn)行編譯的,也就是說openssl靜態(tài)庫是默認(rèn)用的Multithreaded DLL 版本的C運(yùn)行時(shí)庫。

?

原因找到了。那么解決方法,很明顯有兩個(gè)。總之就是將兩個(gè)項(xiàng)目的運(yùn)行時(shí)庫統(tǒng)一。

?

簡單的方式就是將項(xiàng)目的動(dòng)態(tài)庫修改為使用Multithreaded DLL 版本的C運(yùn)行時(shí)庫即可。?
某些情況下你的項(xiàng)目可能不能改變當(dāng)前的運(yùn)行時(shí)庫,你可以將openssl的nt.mak中的/MD開關(guān)修改為/MT然后重新編譯openssl靜態(tài)庫就可以了。

?

?

?

默認(rèn)庫“l(fā)ibrary”與其他庫的使用沖突;請使用 /NODEFAULTLIB:library LNK4098 的解決辦法

您試圖與不兼容的庫鏈接。?

注意?
運(yùn)行時(shí)庫現(xiàn)在包含可防止混合不同類型的指令。如果試圖在同一個(gè)程序中使用不同類型的運(yùn)行 時(shí)庫或使用調(diào)試和非調(diào)試版本的運(yùn)行時(shí)庫,則將收到此警告。例如,如 果編譯一個(gè)文件以使用一種運(yùn)行時(shí)庫,而編譯另一個(gè)文件以使用另一種運(yùn)行時(shí)庫(例如單線程運(yùn)行時(shí)庫對多線程運(yùn)行時(shí)庫),并試圖鏈接它們,則將得到此警告。應(yīng) 將所有源文件編譯為使用同一個(gè)運(yùn)行時(shí)庫。有關(guān)更多信息,請參見使用運(yùn)行時(shí)庫(/MD、/MT 和 /LD)編譯器選項(xiàng)。?


可以 使用鏈接器的 /VERBOSE:LIB 開關(guān)來確定鏈接器搜索的庫。如果收到 LNK4098,并想創(chuàng)建使用如單線程、非調(diào)試運(yùn)行時(shí)庫的可執(zhí)行文件,請使用 /VERBOSE:LIB 選項(xiàng)確定鏈接器搜索的庫。鏈接器作為搜索的庫輸出的應(yīng)是 LIBC.lib,而非 LIBCMT.lib、MSVCRT.lib、LIBCD.lib、LIBCMTD.lib 和 MSVCRTD.lib。對每個(gè)要忽略的庫可以使用 /NODEFAULTLIB,以通知鏈接器忽略錯(cuò)誤的運(yùn)行時(shí)庫。?

下表顯示根據(jù)要使用的運(yùn)行時(shí)庫應(yīng)忽略的庫。?


若要使用第一行運(yùn)行時(shí)庫??? 請忽略第2行的這些庫?
單線程 (libc.lib)?
libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib?

多線程 (libcmt.lib)?
libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib?

使用 DLL 的多線程 (msvcrt.lib)?
libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib?

調(diào)試單線程 (libcd.lib)?
libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib?

調(diào)試多線程 (libcmtd.lib)?
libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib?

使用 DLL 的調(diào)試多線程 (msvcrtd.lib)?
libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib?


例如,如果收到此警告,并希望創(chuàng)建使用非調(diào)試、單線程版本的運(yùn)行時(shí)庫的可執(zhí)行文件,可以將下列選項(xiàng)與鏈接器一起使用:?


/NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib


創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的默认库“LIBCMTD”与其他库的使用冲突;请使用 /NODEFAULTLIB:library的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。