vs開發環境配置及常見錯誤

http://www.360doc.com/content/15/0610/16/6973384_477179688.shtml
VS中ProjectDir的值以及$(ProjectDir)../的含義
ProjectDir的值為E:\code\MyMoonWarrior-master\proj.win32\
$(ProjectDir)../代表工程目錄的上層目錄,即E:\code\MyMoonWarrior-master\
以此類推$(ProjectDir)../../代表E:\code\
vs2010中TargetName與鏈接器輸出名不一致
當出現解決方案生成正確,但是無法執行.exe文件,即系統無法找到指定文件時,提示有:MSB8012: TargetName(,,,) 與 Linker 的 OutputFile 屬性(,,,)不匹配。這可能導致項目生成不正確。若要更正此問題,請確保 (OutDir)、(OutDir)、(TargetName) 和 $(TargetExt) 屬性值與 %(Link.OutputFile) 中指定的值匹配。
一般情況下,將鏈接器--常規----輸出文件中的內容改為 (OutDir)(OutDir)(TargetName)$(TargetExt) 即可。編譯通過。
https://blog.csdn.net/lien0906/article/details/36074559
error LNK2019: 無法解析的外部符號 WinMain,該符號在函數 "int __cdecl invoke_main(void)”中被引用
一,問題描述
MSVCRTD.lib(exe_winmain.obj) : error LNK2019: 無法解析的外部符號 WinMain,該符號在函數 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用
CamShift.exe : fatal error LNK1120: 1 個無法解析的外部命令
error LNK2001: unresolved external symbol _WinMain
debug/main.exe:fatal error LNK 1120:1 unresolved externals
error executing link.exe;
二,原因及解決辦法
產生這個問題的真正原因是c語言運行時找不到適當的程序入口函數,
一般情況下,如果是windows程序,那么WinMain是入口函數,在VS2017中新建項目為“win32項目”
如果是dos控制台程序,那么main是入口函數,在VS2017中新建項目為“win32控制台應用程序”
而如果入口函數指定不當,很顯然c語言運行時找不到配合函數,它就會報告錯誤。
修改設置適應你的需求
如果是windows程序:
1.菜單中選擇 Project->Properties, 彈出Property Pages窗口
2.在左邊欄中依次選擇:Configuration Properties->C/C++->Preprocessor,然后在右邊欄的Preprocessor Definitions對應的項中刪除_CONSOLE, 添加_WINDOWS.
3.在左邊欄中依次選擇:Configuration Properties->Linker->System,然后在右邊欄的SubSystem對應的項改為Windows(/SUBSYSTEM:WINDOWS)
如果是控制台程序:
1.菜單中選擇 Project->Properties, 彈出Property Pages窗口
2.在左邊欄中依次選擇:Configuration Properties->C/C++->Preprocessor,然后在右邊欄的Preprocessor Definitions對應的項中刪除_WINDOWS, 添加_CONSOLE.
3.在左邊欄中依次選擇:Configuration Properties->Linker->System,然后在右邊欄的SubSystem對應的項改為CONSOLE(/SUBSYSTEM:CONSOLE)
error LNK2019: 無法解析的外部符號 __imp___CrtDbgReportW
error LNK2019: 無法解析的外部符號 __imp___CrtDbgReportW,該符號在函數 "void __cdecl ATL::AtlConvAllocMemory<wchar_t>(wchar_t * *,int,wchar_t *,int)" (??$AtlConvAllocMemory@_W@ATL@@YAXPAPA_WHPA_WH@Z) 中被引用
解決方法:工程項目屬性->C/C++->代碼生成-> 運行庫, "多線程 DLL (/MD) " 修改為 "多線程調試 DLL (/MDd)"
error LNK2038: 檢測到“_ITERATOR_DEBUG_LEVEL”的不匹配項: 值“0”不匹配值“2”
使用VS2015版本引用外部webrtc_h264.lib是提示:
error LNK2038: 檢測到“_ITERATOR_DEBUG_LEVEL”的不匹配項: 值“0”不匹配值“2”,
產生這個問題的原因是當前工程是Debug版本,而引用的庫文件時Release版本,只需要把當前工程的Debug模式改成Release模式就可以了,
同樣,如果檢測到“_ITERATOR_DEBUG_LEVEL”的不匹配項: 值“2”不匹配值“0”,
則說明是Release模式引用了Debug的庫文件。
錯誤 1 error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead
錯誤簡介
在VS 2012 中編譯 C 語言項目,如果使用了 scanf 函數,編譯時便會提示如下錯誤:
原因是Visual C++ 2012 使用了更加安全的 run-time library routines 。新的Security CRT functions(就是那些帶有“_s”后綴的函數),請參見:《CRT函數的安全增強的版本》
解決方案
下面給出這個問題的解決方案:
方法一:將原來的舊函數替換成新的 Security CRT functions。
方法二:用以下方法屏蔽這個警告:
1. 在預編譯頭文件stdafx.h里(注意:一定要在沒有include任何頭文件之前)定義下面的宏:
#define _CRT_SECURE_NO_DEPRECATE
2. 聲明
#pragma warning(disable:4996)
3. 更改預處理定義:
項目->屬性->配置屬性->C/C++ -> 預處理器 -> 預處理器定義,增加:
_CRT_SECURE_NO_DEPRECATE
方法三:方法二沒有使用更加安全的 CRT 函數,顯然不是一個值得推薦的好方法,但我們又不想一個一個地改函數名,這里還有一個更簡便的方法:
在預編譯頭文件 stdafx.h 里(同樣要在沒有include任何頭文件之前)定義下面的宏:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
在鏈接的時候便會自動將舊函數替換成 Security CRT functions 。
注意:這個方法雖然使用了新的函數,但是不能消除警告(原因見紅字),你還得同時使用方法二(-_-)。即實際應在預編譯頭文件 stdafx.h 里加入下面兩句:
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
錯誤原因解釋
這種微軟的警告,主要因為那些C庫的函數,很多函數內部是不進行參數檢測的(包括越界類的),微軟擔心使用這些會造成內存異常,所以就改寫了同樣功能的函數,改寫了的函數進行了參數的檢測,使用這些新的函數會更安全和便捷。關於這些改寫的函數你不用專門去記憶,因為編譯器對於每個函數在給出警告時,都會告訴你相應的安全函數,查看警告信息就可以獲知,在使用時也再查看一下MSDN詳細了解。