天天看點

VS 編譯連結錯誤集錦

1 場景

    在同一個解決方案中,testdemo主程式子產品會調用動态連結庫zlib,是以在testdemo的項目中進行如下的屬性設定:

連結器>輸入>附加依賴項:zlib.lib

連結器>正常>附加庫目錄:..\outputs\release\lib

在重新生成解決方案的時候,會出現如下的錯誤:無法打開輸入檔案

步驟

    檢視到已經生成了zlib.lib檔案,并且所有的環境配置正确,然後檢視完整的編譯過程,發現編譯的次序不正确,首先編譯testdemo主程式,然後再編譯zlib子產品,當然會出現問題

解決

    點選testdemo項目,滑鼠右鍵選擇項目依賴項,選擇zlib,確定首先編譯zlib,最後編譯主程式

問題2:fatalerror LNK1112: 子產品計算機類型“MIPS”與目标計算機類型“THUMB”沖突

參考:http://www.jb51.net/softjc/83192.html

解決方案:請選擇與解決方案相同的編譯平台。

問題5:CXX0017: 錯誤: 沒有找到符号test1d.dll  test2d.dll

解決方案:由于解決方案中有些子產品提供的是release版本的dll,是以無法将整個工程置于debug模式

,從debug調試出錯的資訊中最後的d代表的是debug調試版本的dll。是以

必須在解決方案配置中選擇release

問題6:項目源碼非常多,如果修改一個檔案代碼選擇重新生成解決方案大概需要花費15分鐘的時間,

目前沒有測試過生成解決方案是否可以減少編譯和連結的時間?

解決方案:修改某個檔案之後不需要重新生成解決方案,然後直接開始執行調試,自動将修改的檔案重

新編譯。

問題7:error LNK2001: 無法解析的外部符号 "public: virtual class  CTest::TCodeEntry const * 

__thiscall CTest::CTestImpl::GetItemByCode(unsignedint)" (?GetItemByCode@CTest@CTestImpl 

@@UAEPBVTCodeEntry@2@I@Z)     testimpl.obj

解決方案:遇到這個問題,表示在連結的過程中,沒有找到真正的實作,通過半小時的查閱代碼發現如

下的問題:

引用class A

在函數Func(A a)中進行了調用,在實際的過程中,A被定義為了struct結構體類,這個時候連結的過程

中,就沒有辦法找到class A,這一點應該注意。

    在實際的過程中,務必注意真正的實作和聲明是否一緻,這個非常重要。

問題8:error C2259TestQuery::CtestQueryImpl :can not instantiate abstract calss

解決方案:首先了解虛基類作為接口,所有的純虛函數必須在子類中實作,否則編譯出錯,然後檢視當

前的編譯錯誤提示,說明目前的虛基類無法執行個體化,說明有純虛函數沒有實作,通過半個小時的代碼查

閱,發現是子類的函數聲明和基類的函數聲明參數清單不一緻,說明在拷貝代碼的過程中出現錯誤,或

者修改代碼,但是基類代碼沒有同步

1)檢視繼承的基類到底有多少個,這些基類的純虛接口是否已經實作

2)檢視派生類中是否有函數攜帶了=0的純虛接口

3)最好的方法是删除以前的代碼,重新編寫一遍,文法的錯誤,無法在VS中顯示。

問題9:無法打開包括檔案: “corecrt.h”: No such file or directory

VS2013下編譯jsoncpp正常,但是VS2015編譯出現上面的錯誤,需要在包含路徑中添加如下:

 C:\Program Files (x86)\Windows Kits\10\Include\10.0.10150.0\ucrt 

問題10:runtime error! abnormal program termination

說明:在安裝VS2015的環境下,正常運作,在已有的環境,隻是替換一下可執行程式,出現如上的錯誤,初步懷疑是某些動态庫沒有更新,是以重新拷貝所有的動态庫,隻是配置檔案沒有改動,暫時沒有發現上面的問題

問題11:'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS

解決方式一:在調用函數的檔案頭部,調用預編譯宏#pragma warning(disable:4996)

解決方式二:C/C++預編譯器中填寫_CRT_SECURE_NO_WARNINGS

可以采用strcpy_s函數,VS提供的安全拷貝函數,第二個參數指定了目标緩沖區的大小,如果源緩沖區過大,将會進行截取

    本文轉自fengyuzaitu 51CTO部落格,原文連結:http://blog.51cto.com/fengyuzaitu/1946808,如需轉載請自行聯系原作者

繼續閱讀