在vc6工程轉為vc2017工程中,可以直接用vc2017將工程升級。但是有一些錯誤提示要按提示,修改。其中最大的一個問題是下文的第5條,最后發現是LASLib.lib的版本太老導致的問題。只要把這個llib對應的函數注釋掉就可以。laslib可以使用高版本的。
另外,我也嘗試了在vc2017新建“文檔/視圖”程序,將將其移動過去。其實根據就搞錯了,原來的程序是基於對話框,“文檔/視圖”模式會出錯。
1、編譯錯誤C2065 “i”: 未聲明的標識符
解決辦法,將
for (int i = 0; i < m_deviceList.size(); i++)
{
m_ctlDevicelist.AddString(m_deviceList[i]);
}
中變量i的定義放到函數體開頭
int i;
for (i = 0; i < m_deviceList.size(); i++)
{
m_ctlDevicelist.AddString(m_deviceList[i]);
}
2、 fopen建議修改為fopen_s
關閉sdl檢查即可或或者聽從建議使用fopen_s
3、關於error LNK2005的解決辦法
項目中出現這個錯誤的原因是:原始工程為TowerTreat,工程中有個TowerTreat.cpp,文件中定義了CAboutDlg類,但是在vs 2017中我將工程名稱改為了TowerModeler,TowerModeler.cpp中也有一個CAboutDlg類,這樣在鏈接的時候會沖突。
4、error LNK2019: 無法解析的外部符號
出現原因是沒有配置相關的lib(我的項目中包括opengl的庫,opengl的配置:https://blog.csdn.net/kiaralovelysheep/article/details/81735794)
5、LNK1104 無法打開文件“LIBCD.lib”
出現這類問題一般是由於所運行的項目是VC6(或者vs2003)創建的,而后又用VS2005或者更高版本工具打開項目導致的,原因都是因為LIBCD.lib文件被更改了.要解決問題的話,只要在鏈接設置那里忽略它就沒問題了。
解決辦法是:
第一種方案:在項目-屬性-鏈接器- 命令行 加 /nodefaultlib:libcd
第二種方案:在項目-屬性-鏈接器- 輸入-忽略特定庫加:LIBCD.lib
兩種方法都可以。
參考自:https://www.cnblogs.com/hyfemma/archive/2010/11/14/1876846.html
6、錯誤 LNK2005 "class _AFX_THREAD_STATE * __stdcall AfxGetThreadState(void)" (?AfxGetThreadState@@YGPAV_AFX_THREAD_STATE@@XZ) 已經在 mfc140d.lib(mfc140d.dll) 中定義 TowerModeler D:\repos\GridModeler\TowerModeler\nafxcwd.lib(afxstate.obj) 1
7、嚴重性 代碼 說明 項目 文件 行 禁止顯示狀態
錯誤 LNK1112 模塊計算機類型“x64”與目標計算機類型“x86”沖突 TowerModeler D:\repos\GridModeler\TowerModeler\ucrtd.lib(ucrtbased.dll) 1
https://blog.csdn.net/tfy1028/article/details/8660823
8、IntelliSense: "char *" 類型的實參與 "LPCWSTR" 類型的形參不兼容
https://blog.csdn.net/quinn1994/article/details/94618725
9、/ZI”和“/Gy-”命令行選項不兼容
https://jingyan.baidu.com/article/46650658fcec97f549e5f826.html
10、錯誤 LNK2026 模塊對於 SAFESEH 映像是不安全的。 TowerTreat D:\repos\DNPowerGridModelBuilder\LASlib.lib(lasreader.obj)
https://jingyan.baidu.com/article/47a29f24334312c01423992e.html
11 0x00007FFF51140BCB (mfc140d.dll)處(位於 TowerModeler.exe 中)引發的異常: 0xC0000005: 讀取位置 0xFFFFFFFFFFFFFFFF 時發生訪問沖突。
12 引發了未經處理的異常:讀取訪問權限沖突。 this 是 nullptr。
在vc 6.0中可以這樣獲取句柄:CTowerTreatDlg* mainWnd = (CTowerTreatDlg*)AfxGetMainWnd();
但是在visual studio中不行。我們可以先獲取app,再通過app的m_pMainWnd轉化。
CTowerTreatApp* application = (CTowerTreatApp*)AfxGetApp();
CTowerTreatDlg* mainWnd = (CTowerTreatDlg*)application->m_pMainWnd;
參考自:https://blog.csdn.net/aastoneaa/article/details/7821475