1、嚴(yán)重性 代碼 說明 項(xiàng)目 文件 行 禁止顯示狀態(tài) 錯誤 C1047 對象或庫文件“.lib”是使用與其他對象(如“x64\Release\main.obj”)不同的
嚴(yán)重性 代碼 說明 項(xiàng)目 文件 行 禁止顯示狀態(tài)
錯誤 C1047 對象或庫文件“.\lib\SceneTempCal.lib”是使用與其他對象(如“x64\Release\main.obj”)不同的編譯器版本創(chuàng)建的;請使用相同的編譯器重新生成所有對象和庫 SceneTest E:\osg\work\ThermalCharacteristics_20220628\SceneTest\LINK 1
1、錯誤原因
VS2019 或者其他編譯器VS2008開發(fā),之前一直用的Debug模式,代碼編譯正常
最近改為Release模式,一編譯就出現(xiàn)這個錯誤:
LINK : fatal error C1047: 對象或庫文件“.lib”是使用與其他對象(如“x64\Release\main.obj”)不同的編譯器版本創(chuàng)建的;請使用相同的編譯器重新生成所有對象和庫
網(wǎng)上搜了一下,說是:
“我這幾天也遇到了這個問題,用別人提供的lib,在vs2019下 debug模式可以運(yùn)行,但release模式下就不行,出現(xiàn)了和你一樣的錯誤。開始我還以為是lib不兼容,最后發(fā)現(xiàn)這個lib在LTCG下不能被解析,做如下改正即可:
Release模式下->配置屬性->高級->全程序優(yōu)化->使用鏈接時間代碼生成 將這里的默認(rèn)項(xiàng) “使用鏈接時間代碼生成”改為“無全程序優(yōu)化”。 接下來就可以運(yùn)行了。
一般低版本生成的lib都是可以被高版本編譯器所用的,這個是兼容性的基礎(chǔ),呵呵!”
于是 改屬性吧,改為 無全程序優(yōu)化后,會報(bào)個另一個錯,心想不能這么一直搞下去啊,肯定是哪不去了。
升級后重編譯 也提示這個錯,
但是這一次 屬性里去掉無全程序優(yōu)化后 再編譯就通過了。
搞不懂,一個lib庫 編譯起來怎么還有這種情況?
屬性->常規(guī)->項(xiàng)目默認(rèn)值->全程序優(yōu)化 將這里的默認(rèn)項(xiàng) “使用鏈接時間代碼生成”改為“無全程序優(yōu)化”。
這樣設(shè)置后很多同學(xué)貌似解決了這個問題 ,然而并木有包括我。。。
記錄一下,但是呢又出現(xiàn)了后面問題。
編譯會提示新的錯誤:
fatal error C1900: “P1”(第“20081201”版)和“P2”(第“20070207”版)之間 Il 不匹配
。。。。。。。。。。。。。。。
繼續(xù)。。。
原因:鏈接時使用了某些用更新的編譯器編譯的LTCG(Link Time Code Generation)的library。之所以x86是正常的,是因?yàn)楹芮涉溄訒r使用的x86 lib是普通lib,而amd64 lib是LTCG lib。
說實(shí)話看不懂這是啥庫。
解決方案兩種:
- 1)更新當(dāng)前使用的編譯鏈接工具,使其與lib匹配。當(dāng)然,這樣編譯出來的二進(jìn)制文件可能會有所改變(優(yōu)化可能不同),所以可能需要重新測試。
- 2)使用不帶LTCG的library
說了等于沒說,而且我覺得我這情況也不一樣,因?yàn)樵诹硗庖慌_機(jī)器上編譯是OK的。
后來我自己解決方法是下載:vs2008出現(xiàn)這樣的錯誤是由于版本沒有升級,在官網(wǎng)下載了一個升級包vs2008sp1,安裝后程序運(yùn)行正確。
這時我才意識到,所用的.lib庫是在一個升級版的vs2008上編譯得到的,至于在release和debug模式下出現(xiàn)的錯誤不一致,我就不明白了。
既然這個lib庫是在vs2008上編譯的,vs2010應(yīng)該是可以兼容使用的,我又檢查了最開始在vs2010下運(yùn)行的這個程序的配置,是在release模式下運(yùn)行的,我改為debug模式運(yùn)行后正確,檢查了release和debug的配置,發(fā)現(xiàn)“項(xiàng)目->屬性->配置屬性->常規(guī)->全程序優(yōu)化” 在兩個模式下不同,將這個選項(xiàng)改為 “無全程序優(yōu)化”,之后程序就可以在兩種模式下正常運(yùn)行了。
通過這次調(diào)試得到一個結(jié)論,引用別人lib或者dll的時候,出現(xiàn)連接問題一般都是由于當(dāng)前編譯器版本過低,向上無法兼容;另外一些原因是編譯器的設(shè)置問題,導(dǎo)致無法正確解析庫文件。
vs2008中文 sp1版本下載地址:sp1中文版地址。
vs2008 英文sp1版本下載地址:sp1英文版地址。
2、意外的預(yù)編譯頭錯誤,只需重新運(yùn)行編譯器就可能修復(fù)此問題
昨天還好好的,今天打開vs2008,莫名就出現(xiàn)“意外的預(yù)編譯頭錯誤,只需重新運(yùn)行編譯器就可能修復(fù)此問題”。清理,重新編譯,不行;重啟編譯器,清理,重新編譯,還不行;最后試試,重啟電腦,打開工程,清理,重新編譯,又可以了。
官方給的解決方法:
-
方法 1:
- 禁用/analyze編譯器選項(xiàng),則它會被啟用。
-
方法 2:
- 開始清理生成。
-
方法 3:
- 重新啟動計(jì)算機(jī)。
-
方法 4:
-
禁用創(chuàng)建/使用預(yù)編譯頭的編譯器選項(xiàng)。
注意這些方法不能保證正常工作。即使您使用這些方法之一,您可能仍會遇到此問題。
我的解決方案,重啟電腦…
3、 warning LNK4099: 未找到 PDB“vc90.pdb”(使用“…/…/lib\SafeStored.lib”或在“f:\sdologin_code\trunk\bin\Debug\pdb\vc90.pdb”中尋找);正在鏈接對象,如同沒有調(diào)試信息一樣
LNK4099警告通常表示編譯器無法找到與您的項(xiàng)目相關(guān)的調(diào)試信息文件(.pdb文件)。在您的情況下,它正在嘗試查找名為"vc90.pdb"的文件。這個問題通常與編譯器的調(diào)試信息生成設(shè)置有關(guān)。
當(dāng)多個Project是分開編譯的,主項(xiàng)目和子項(xiàng)目的pdb文件名相同(默認(rèn)都是vc90.pdb或vc100.pdb)從而造成找不到調(diào)試信息,解決的辦法是修改車險(xiǎn)數(shù)據(jù)庫文件名vc90.pdb為【項(xiàng)目名稱.pdb】,如下所示:
一、在VS2008工程中,經(jīng)常出現(xiàn)warning LNK4099: 未找到 PDB“vc90.pdb等問題,解決辦法如下:
-
在項(xiàng)目屬性—C/C++—輸出文件—程序數(shù)據(jù)庫文件名后面填寫$(IntDir)\vc80.pdb。
-
在項(xiàng)目屬性—連接器—調(diào)試—生成調(diào)試信息后面改成“否”。
舉例: “warning LNK4099: 未找到 PDB“vc120.pdb”(使用“sqlite3d.lib(sqlite3secure.obj)”或在“D:\test\Debug\vc120.pdb”中尋找);正在鏈接對象,如同沒有調(diào)試信息一樣”。
使用VC時鏈接了第三方靜態(tài)庫, 并且第三方靜態(tài)庫(一般是開源的三方庫)是在一個solution下的多個project, 當(dāng)然,
網(wǎng)上基本都是這么回答的, 其實(shí)本質(zhì)原因是因?yàn)檫@些開源庫一般都會通過各種方式修改solution和project的默認(rèn)路徑
把二進(jìn)制生成到同一個目錄下, 比如lib, 而我們自己平時簡單的靜態(tài)庫工程是不怎么修改默認(rèn)工程配置的.由于每個
開源庫的作者有自己的工程組織方式, 但導(dǎo)致LNK4099的最終原因無非是PDB路徑問題。
解決方案
-
a. 如果確認(rèn)不需要PDB, 即不需要調(diào)試開源庫, 完全可以在設(shè)置里將/Zi或/ZI去掉, 這樣即能消除warning也能提升開源庫編譯速度 。
-
b. 如果需要調(diào)試開源庫, 方法也不復(fù)雜
- b.1. 將開源庫project里的C/C+±>General->Debug Information Format 設(shè)置為Zi或ZI(兩者區(qū)別請自行g(shù)oogle, Zi就夠用了, 只是高版本的VS默認(rèn)都是ZI)
- b.2. 然后在C/C+±>Output Files->Pragram Database File Name 設(shè)置為(OutDir)(OutDir)(TargetName).pdb, (有些2B開源庫這里設(shè)置的跟VS默認(rèn)的是一樣的比如(IntDir)vc(IntDir)vc(PlatformToolsetVersion).pdb, 但把IntDir改成了同一個目錄, 每個project生成出來的pdb名字路徑都是一致的, 當(dāng)然就會出問題), 這里需要注意的是, 一定要確保(OutDir)(OutDir)(TargetName)是有意義的, 個別開源庫完全不用vs自帶的宏, 甚至個別開源庫需要configure之后才生產(chǎn)vc project, 甚至是絕對路徑, 但你所要確保的是, 目錄必須跟生成的.lib是同一個, 文件名(不包括擴(kuò)展名)必須是和生成的xxx.lib的xxx是一致的. 之后你要做的就是把每個project的debug&release都按照如上改好再編譯就ok了。
4、VS2008中編譯通過,但調(diào)試時出現(xiàn)“未使用調(diào)試信息生成二進(jìn)制文件”的問題
Debug模式,運(yùn)行時完全正常,但是一調(diào)試就出現(xiàn)對話框,顯示出錯信息:
“無法找到“XXX.exe”的調(diào)試信息,或者調(diào)試信息不匹配。未使用調(diào)試信息生成二進(jìn)制文件?!?/p>
VC項(xiàng)目是空項(xiàng)目。發(fā)現(xiàn)其他的項(xiàng)目都可以調(diào)試,就“空項(xiàng)目”不行。
解決方法:
首先打開菜單 項(xiàng)目->項(xiàng)目屬性頁
- 1。選擇 配置屬性->鏈接器->調(diào)試->生成調(diào)試信息 改為 是 。
- 2。選擇 配置屬性->C/C++ ->常規(guī)->調(diào)試信息格式 改為 用于“編輯并繼續(xù)”的程序數(shù)據(jù)庫(/ZI) 。
- 3。選擇 配置屬性->C/C++ ->優(yōu)化->優(yōu)化 改為 禁用(/Od) 。
5、vs2008為什么有些解決方案x64不能生成,顯示已跳過,也不能編譯?打開屬性,總是報(bào)錯
查下“生成”-> “配置管理器”-> “活動解決方案平臺”是否選擇的“win32”或者x64。
最近準(zhǔn)備編譯64位版本的程序。因?yàn)橹耙呀?jīng)安裝了VS 2008 或者更早的版本,開始以為只是使用VS 2008的安裝文件添加功能即可,后來發(fā)現(xiàn)沒這么簡單。
坑啊,原來vs2008或者更早以前裝x64環(huán)境要自己勾選,made,這個問題導(dǎo)致我花了一整天時間才能發(fā)現(xiàn)。編譯時選擇”重新生成解決方案“,會出現(xiàn),”已跳過生成: 項(xiàng)目”, 不編譯, 也不報(bào)錯。…
1>------ 已跳過生成: 項(xiàng)目: INSTALL, 配置: Release x64 ------
1>沒有為此解決方案配置選中要生成的項(xiàng)目
========== 生成: 成功 0 個,失敗 0 個,最新 8 個,跳過 1 個 ==========
安裝64位操作系統(tǒng)不是編譯64位程序的必要條件,關(guān)鍵是要裝64位程序的編譯器。雖然標(biāo)題寫著如何在VS2008中編譯,但其實(shí)vs2005也是類似。如果在選擇平臺的下拉列表里找不到x64,可能是沒有安裝x64編譯支持。在VS安裝程序里再裝上就可以了。
原本的是沒有勾選的…。
6、fatal error LNK1112: 模塊計(jì)算機(jī)類型“X86”與目標(biāo)計(jì)算機(jī)類型“x64”沖突32位可以編譯 64位1>.\Debug\dxstdafx.obj : fatal error LNK1112: 模塊計(jì)算機(jī)類型“X86”與目標(biāo)計(jì)算機(jī)類型“x64”沖突
-
這個錯誤消息表明你正在嘗試在一個32位環(huán)境下編譯一個64位目標(biāo),導(dǎo)致了鏈接器錯誤。要解決這個問題,你需要確保編譯器和鏈接器的設(shè)置匹配。以下是一些解決方法:
-
更改項(xiàng)目配置為64位:
- 打開你的項(xiàng)目(Visual Studio或其他IDE)。
轉(zhuǎn)到項(xiàng)目設(shè)置或?qū)傩浴?br> 在配置管理器中,確保你的項(xiàng)目配置為64位(x64)而不是32位(x86)。
重新編譯你的項(xiàng)目。
- 打開你的項(xiàng)目(Visual Studio或其他IDE)。
-
檢查所有依賴項(xiàng):
- 如果你的項(xiàng)目依賴于其他庫或模塊,請確保這些庫也是64位的版本。
如果你使用了第三方庫,確保你使用了與你的目標(biāo)平臺匹配的庫版本。
- 如果你的項(xiàng)目依賴于其他庫或模塊,請確保這些庫也是64位的版本。
-
更新編譯選項(xiàng):
- 檢查你的項(xiàng)目的編譯選項(xiàng),確保它們與64位編譯兼容。這包括編譯器標(biāo)志和預(yù)處理器定義。
-
使用條件編譯:
- 如果你需要在32位和64位目標(biāo)之間切換,可以使用條件編譯指令來區(qū)分不同的平臺。例如,你可以使用#ifdef和#ifndef來根據(jù)不同的目標(biāo)設(shè)置不同的代碼路徑。
-
重新安裝工具鏈:文章來源:http://www.zghlxwxcb.cn/news/detail-696740.html
- 如果你使用的是Visual Studio,有時候重新安裝Visual Studio可以解決一些配置問題。
檢查操作系統(tǒng):
- 如果你使用的是Visual Studio,有時候重新安裝Visual Studio可以解決一些配置問題。
-
確保你的操作系統(tǒng)本身支持64位應(yīng)用程序運(yùn)行。如果你的操作系統(tǒng)是64位的,那么你應(yīng)該能夠編譯和運(yùn)行64位應(yīng)用程序。清理解決方案重新生成。文章來源地址http://www.zghlxwxcb.cn/news/detail-696740.html
到了這里,關(guān)于visual studio 2008 編譯項(xiàng)目出現(xiàn)層次不窮問題枚舉的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!