VS2015/2017/vsCode C++ 报错解决方案 笔记

1~4:VS2015

5往后:VS2017

部分:vsCode

想喊百度的ai时,可搜:opencv内存清理。

1、LNK1181:cannot open input file 'ImageProcessing.lib'

明明路径是对的,然后路径上也确实有这个lib文件,但就是报错。

解决方案:

solution 属性配置 Project Dependencies ,选择main_project,然后勾选上其依赖的子project。

这样就可以成功编译了

参考链接:VS2013 error LNK1104: cannot open file " .lib"

2、vs2015 qt ui CannotOpenFile

VS2015,一打开ui文件就闪退。

解决方案:

右击ui文件,选择[打开方式],重新添加,并将其设置为默认值;
添加的路径为:C:\Qt\Qt5.9.7\5.9.7\msvc2015_64\bin\designer.exe

3、MSB8020: 无法找到 v143 的生成工具(平台工具集 =“v143”)。若要使用 v143 生成工具进行生成,请安装 v143 生成工具

找到项目根目录下”.vcxproj”后缀的文件,用记事本方式打开。

将提示无法找到的“v143”全部替换成你自己对应的“v140”。

切换回Visual Studio,会弹出以下提示,我们选择“全部重新加载”。

在菜单中选择“生成->重新生成解决方案”。

选择生成->重新生成解决方案,这时候可以看到,生成成功,没有报错,完美解决问题。over

4、imshow图像无法显示 或显示全白且无法点开

方法一:cv::destroyAllWindows()

出现imshow图像无法显示解决方案

cv::destroyAllWindows();//先显示出来(cv::imshow)再销毁,再重新用就可以了(只需用一次就能恢复正常

cv::destroyAllWindows();//先显示出来(cv::imshow)再销毁,再重新用就可以了(只需用一次就能恢复正常)

方法二:

原因:可能是由于上一次运行时,图像imshow出来的位置是在拓展屏。再次运行时图像imshow的位置仍然默认在拓展屏,但电脑并没有接上拓展屏。导致图像没有正常显示且无法点击打开。

解决方案:将拓展屏接上持续运行程序一次,将无法显示的图像拉到非拓展屏的主桌面,然后点击图像右上角的“X”把图像关闭后再结束运行程序。即可。

拔掉拓展屏后程序重新运行一次,图像即可正常显示。

5、E1696 无法打开Qt源文件

查看自己安装的qt插件名字是否与工程本身设置的对上。不是自己安装的那个名字的话,工程会找不到Qt相关的头文件。

E1696:无法打开源文件 “platform.winmd”

C1107:未能找到程序集“platform.winmd”: 请使用 /AI 或通过设置 LIBPATH 环境变量指定程序集搜索路径

在项目属性的C/C++常规页找到“使用Windows运行时扩展”选为“是”

如果问题没解决的话在如下路径里找到了platform.winmd所在的文件夹:

然后可以试着在其他#using指令里加一下(windows.winmd同理)

实在找不到可用软件everything搜索

6、C2440:'initializing': cannot convert from 'const wchar_t [5]' to 'TCHAR *'

原代码:

TCHAR szFileName[MAX_PATH] = { 0 }; //TCHAR* szVersion = (PWCHAR)"v1.0"; TCHAR* szVersion = L"v1.0"; TCHAR dwBufferSize = MAX_PATH;

解决方案:
将 TCHAR* szVersion = L"v1.0";

替换为 TCHAR* szVersion = (PWCHAR)"v1.0";

即:

TCHAR szFileName[MAX_PATH] = { 0 }; TCHAR* szVersion = (PWCHAR)"v1.0"; //TCHAR* szVersion = L"v1.0"; TCHAR dwBufferSize = MAX_PATH;

即可。

7、E0167:"const wchar_t *" 类型的实参与 "PWCHAR" 类型的形参不兼容

原代码:

//return GenerateMiniDump(NULL, lpExceptionInfo, (PWCHAR)"test"); return GenerateMiniDump(NULL, lpExceptionInfo, L"test");

解决方案:
将 return GenerateMiniDump(NULL, lpExceptionInfo, L"test");

替换为 return GenerateMiniDump(NULL, lpExceptionInfo, (PWCHAR)"test");

即:

return GenerateMiniDump(NULL, lpExceptionInfo, (PWCHAR)"test"); //return GenerateMiniDump(NULL, lpExceptionInfo, L"test");

即可。

8、error LNK2001: 无法解析的外部符号 _DllMainCRTStartup

当创建DLL项目时,尤其是一些资源转化成dll时,其不要dllmain()时,会出现:error LNK2001: 无法解析的外部符号 _DllMainCRTStartup@12 错误。

解决办法:右击,项目属性-->连接器-->高级-->无入口点:改成 是。/NOENTRY 选项是创建纯资源DLL所必需的。使用此选项可防止LINK将对_main的引用链接到DLL。

9、VS编译库时生成DLL没有产生lib的解决方法(三种)

使用vs生成DLL时,没有产生lib,一般发生在我们自己创建的DLL项目中,产生这个问题的主要原因是没有导出类。
导出DLL标记有两种方法,只要采用其中一种就可以解决。


1.添加def文件

在工程上右键 -> 添加 -> 新建项 -> 选"模块定义文件(.def)" -> 随便输入个名字 -> 添加

或:

项目->属性->链接器->输入->模块定义文件,设置你的模块定义文件,默认为lib.def,也可以改成你想要定义文件的名称。注意,这里是模块定义文件的名称,不是.lib文件。


2.导出类

// 注意,_declspec(dllexport)导出标记在class与类名中间 class _declspec(dllexport) ImageProcessing { public: ImageProcessing(); ~ImageProcessing(); }
_declspec(dllexport) int fun(int m); // 函数的导出标记位置在返回值最前面

超重点,DLL类的导出标记在class与类名之间,而函数的导出标记在返回类型之前

3.预处理器定义添加

点击应用,然后在
C/C+±预处理器-预处理下定义-添加:LIBLEPT_EXPORTS

10、C3646:未知重写说明符

参考链接:C++报错: error C3646: 未知重写说明符

类的定义的先后顺序有误

如果一个类的成员中包含另一个类,则被包含的类的生命一定要在包含的类之前。

class Auto { Tire tire; } class Tire { int weight; } // This will cause error C3656

解决方法:调整类的位置。

11、error MSB3073: 命令“setlocal

打开自己项目,右键单击属性进入生成后事件,命令行查看自己路径是不是正确的。

解决方法如下图:

12、C3688:文本后缀”銆”无效:未找到本运算符模板"operator"“銆”

解决方法:在菜单栏中点击文件目录下的高级保存选项,进入之后,将编码由Unicode(UTF-8无签名)更换为简体中文(GB2312)-代码页936 就好。

若找不到“高级保存选项”:

over。

13、CMake报错:编译过程中一直显示缺少dll

cmake编译过程中一直显示缺少dll,则直接将.dll复制到cmake安装文件夹的bin文件夹里即可。

14、CMake报错:Invalid character escape '\T'. Call Stack (most recent call first)

CMake编译报错: Invalid character escape '\T'. Call Stack (most recent call first)

解决方案:将填入的路径里的“\”全部改成“/”就好。

如果检查斜杠都对了,那就根据报错信息看一下路径是否都存在。

15、QT error C1083: Cannot open include file: 'QMainWindow': No such file or directory

前情提要:一个小时前都还能正常编译允许的qt工程,在尝试添加现有dll工程与同一个解决方案下时,突然间一堆qt报错,基本都是C1083找不到qt头文件的错误。

其他解决方法都尝试过还是一直未能解决报错。可以试下:

$(Qt_INCLUDEPATH_)

16、运行后没有黑色控制台显示

17、Qt项目的exe拷过去后不能运行

17.1 缺dll

缺dll的在路径“C:\Qt\Qt5.9.7\5.9.7\msvc2015_64\bin”下找,缺什么补什么,放到exe同级即可。

17.2 缺平台集和无法读取jpg图片

路径:“C:\Qt\Qt5.9.7\5.9.7\msvc2015_64\plugins”

缺平台集:把文件夹“platforms”放到exe同级位置。

无法读取jpg图片:把文件夹“imageformats”放到exe同级位置。

示例:jpg图片和平台集文件夹以及缺的dll都放在exe同级。

18、vs release模式下无法断点

1)

2)

3)

调试–》选项–》调试(常规),一下两个选项取消勾选

19、cout打印信息缺失及中文乱码

问题现象

一开始是发现 “cout<<” 打印信息,“printf()”打印信息正常。


故做了以下尝试

1)cpp文件顶部位置添加:

#pragma execution_character_set("utf-8")

2)main函数内起始位置添加:

SetConsoleOutputCP(65001);//更改控制台输出编码 —— 65001表示UTF-8编码格式 QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));//设置显示中文

3)改变文件编码格式。


尝试过程中一直出现问题

1)库工程的cpp内 cout<< 打印中文乱码;

2)库工程的cpp内 cv::imshow 窗口名字中文乱码;

3)test工程的main函数中 cout<< 打印中文乱码;

4)test工程的通用函数cpp中 cout<< 打印中文乱码;

5)test工程的通用函数cpp中 qDebug()<< 打印中文乱码;

6)test工程的通用函数cpp中 QString 类型成员中文乱码;

最终成功解决方案

1)统一各单元所在cpp的编码格式,即【简体中文(GB2312) - 代码页 936】;

2)test工程的通用函数cpp中,添加“#pragma execution_character_set("utf-8")”;

3)string类型转QString类型时,将 QString::fromStdString(stringVal) 换成 QString::fromLocal8Bit(stringVal.data()) 。

我的库工程是纯C++工程,test是QT工程。

因为test中需要用到QT的QSettings来解析配置文件来获取所需信息。

并且test中用上了 qDebug()<< 来打印信息。

test工程的通用函数cpp中,有一个函数要求必须加上 “#pragma execution_character_set("utf-8")”,

故该通用函数cpp中编码格式已转变为utf-8。

即在该通用函数cpp中,打印信息需用 qDebug()<< 来打印。

然后string类型转QString类型时,

需用 QString qStringVal = QString::fromLocal8Bit(stringVal.data()),// utf-8的情况下用

而不能用 QString qStringVal = QString::fromStdString(stringVal) 。// 默认编码格式是GB2312的时候

解释

qDebug()<< 与 cout<< 需要的编码格式不一样,正好互斥。

qDebug()<< 是 【utf-8】

cout<< 是【简体中文(GB2312) - 代码页 936】

20、串口通信接收端接收数据互相乱码

现象:串口通信发送端正常,但两边接受数据都相互乱码。

原因:两边的编码格式不同,可能一边是utf-8,一边是GB2312。

解决办法:两端的编码格式同一即可。例如qt的话就一两行代码即可(设置编码格式)。

21、error C2760: 语法错误: 意外的令牌“标识符”,预期的令牌为“类型说明符

解决方法:

22、QTChart 已引用还是报错

解决方法:

23、VS 引用了编译即报错

在使用QChart时可能会出现添加QValueAxis时报错,解决方案可使用如下几种:

  1. 错误原因可能是造成与windows.h冲突,如果项目中包含windows.h文件,可将该文件修改为qt_windows.h。若项目中未包含该头文件可尝试如下做法。
  2. 在有错误输出类似于max、min定义错误时,错误原因:模板函数max和visual c++中的全局宏max冲突

error C2059: 语法错误:“<L_TYPE_raw>” d:\qt5.7.1\5.7\msvc2013\include\qtcharts\qvalueaxis.h

error C2061: 语法错误: 标识符“QDateTime” d:\qt5.7.1\5.7\msvc2013\include\qtcharts\qdatetimeaxis.h

解决方案:

  1. 可在项目属性中预定义添加NOMINMAX,禁止使用c++的宏定义。修改方式:项目属性 ——> C/C++ ——> 预处理器 ——> 预处理器定义。或是在pro文件中添加DEFINES += NOMINMAX。
  2. 加括号,与vc中的max和min宏定义区分开。(std::max)(argv).

24、字符 L“XXX”,PWchar等编译不过

解决方法:

25、vs2017一点击 “本地窗口调试” 就卡死

当使用Visual Studio 2017(VS2017)进行调试时,如果遇到点击“本地窗口”(Locals Window)导致程序卡死的情况,可以尝试以下几种解决方法:

  1. 禁用Microsoft符号服务器:(本人该项就已经解决了问题)
    • 进入“工具”(Tools)->“选项”(Options)->“调试”(Debugging)->“符号”(Symbols)。
    • 在“符号文件(.pdb)位置”(Symbol file (.pdb) locations)下,取消勾选“Microsoft符号服务器”(Microsoft Symbol Servers)。
    • 在“自动符号加载首选项”(Automatic symbol loading preferences)下,选择“仅指定的模块”(Load only specified modules)。
    • 应用更改并尝试再次调试。
  2. 启用托管兼容模式
    • 进入“工具”(Tools)->“选项”(Options)->“调试”(Debugging)。
    • 勾选“使用托管兼容模式”(Use Managed Compatibility Mode)。
    • 应用更改并尝试再次调试。
  3. 清理与构建
    • 清理解决方案并重新构建所有项目。这可以解决因旧文件或缓存导致的问题。

26、检查内存泄漏工具

Visual Leak Detector | Enhanced Memory Leak Detection for Visual C++

内存泄漏工具的使用文档:有了它,再也不怕 C++ 内存泄露了!_51CTO博客_C++ 内存泄露

VC++内存泄漏检测工具VLD使用方法:VC++内存泄漏检测工具VLD使用方法 - 碎银三二两 - 博客园

27、向日葵远程别人后,自己电脑键盘就失效

方法一:可以尝试按ctrl+alt,或是这两个键顺序交换。(第一次用的时候有效,后面都无效)

方法二:电脑锁定或睡眠后,重新打开。(后面用的该方法有效)

28、Visual Studio 2015 远程调试方法

需求:

(在没有安装VS2015的机器上安装发布的程序,运行出现异常,而开发机器上不会出现异常。因此采用远程调试。)

开发的电脑a中有源码工程,没有开发工具的电脑b中放了a工程编译出的exe。

需要在电脑b中运行exe的同时,电脑a中的工程可以打断点调试改bug。

解决方案(启动远程调试的方法)

【Visual Studio 2015 远程调试方法】_vs2015 远程调试-CSDN博客

1、在 Visual Studio 的安装目录中找到远程调试工具(msvsmon.exe)

拷贝C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger文件夹下的x64整个文件夹压缩发到客户机中。

2、在客户机中启动msvsmon.exe,如下图:

设置客户机上 身份验证模式为无身份验证,即禁用身份验证,勾上“允许任何用户进行调试(A)”。

3、关闭防火墙,或者设置允许远程调试。

4、将程序拷贝到虚拟机。执行程序。

5、在主体机器上启动 Visual Studio ,点击 “调试” > “附加到进程”。设置如下图

附加测试程序到进程:

备注:注意PDB一定要加载正确,选择调试-选项-符号,选择PDB路径

29、GitHub加速

解决办法:使用Watt Toolkit 。

「Watt Toolkit」是一个开源跨平台的多功能 Steam 工具箱。它是由江苏蒸汽凡星科技有限公司开发与维护的 (GNU) 自由开源软件,采用 GPL v3 开源协议同时发布于 Github 及 Gitee。

可用于加速GitHub

一、下载与安装

官方正版下载地址跳转:「Watt Toolkit」(原steam++)

二、Watt Toolkit的使用及配置

1、双击运行桌面快捷方式

就能成功进入Github啦!

注意!!!:

三、加速失败,443端口被占用的解决办法

这个报错大概率是你电脑里安装了虚拟机 VMware ,而开启了虚拟机的共享文件夹就会导致计算机的443端口被占用。(本人就是这种情况)解决方案如下:

1、打开虚拟机,选择菜单栏中的编辑 ->首选项

选择共享虚拟机

over

其余常用科研工具:常用科研工具(持续更新)_watt toolkit 类似-CSDN博客

29.1 修改 Hosts 文件

这是最常见且有效的解决方案之一,通过直接指定 GitHub 的 IP 地址来绕过 DNS 污染。

步骤:

  1. 获取最新的 GitHub 相关域名 IP 地址

    • 访问 https://ipaddress.com/website/github.com 查找当前可用的 IP

    • 或使用 https://github.com.ipaddress.com/

  2. 修改系统的 hosts 文件

    • Windows:C:\Windows\System32\drivers\etc\hosts

    • Mac/Linux:/etc/hosts

  3. 添加以下内容(IP 地址请替换为最新获取的):

    # GitHub Start 140.82.114.4 github.com 185.199.108.153 assets-cdn.github.com 199.232.69.194 github.global.ssl.fastly.net # GitHub End
  4. 刷新 DNS 缓存

    • Windows: 打开命令提示符,输入ipconfig /flushdns

    • Mac: 终端输入sudo killall -HUP mDNSResponder

    • Linux: 终端输入sudo systemctl restart network-manager

30、SVN无法清理

现象:

SVN更新下载失败,显示要清理。但清理时又显示清理失败,显示系统找不到 “.svn-base” 文件,找不到指定的文件。(无论哪个路径都一样报一样的错)

“D:DXSWsvn\pristine\ff\ff771803791d080d26c87e4bae7dded5344d4427.svn-base"”
系统找不到指定的文件。
实则就是说 svn-base 这个文件被误删或者360把这个文件给隔离了,才导致svn报错。
那我们就直接进到对应的目录:D:DXSWsvn\pristine\ff,新建一个空的txt文件,然后重命名为:ff771803791d080d26c87e4bae7dded5344d4427.svn-base(后面这个.svn-base 是文件后缀名,把.txt改成.svn-base!!!)
最后重新执行clean up,问题解决!!!

解决办法

直接找到对应路径,手动创建一个报错框里提示的那个同名文件 即可。

参考链接:svn更新、还原、清理报错解决 - 仰望星空还有梦 - 博客园

看上图报的是 不能打开文件

over

31、Kaggle手机验证解决办法

1.扩展程序里搜Header Editor

2.点击“管理”

3. 上方导航栏点击【导出和导入→ 下载规则输入框中输入https://azurezeng.github.io/static/HE-GoogleRedirect.json→点击输入框右方的下载→下载完成后点击保存】

32、LNK2005 "class BasicsProcess bp" (?bp@@3VBasicsProcess@@A) already defined in ImageProcessing.obj ImageProcessing

错误原因:

  • class BasicsProcess bpImageProcessing.objLabel_Comparator.obj中被重复定义。
  • 即 在同一工程中的ImageProcessing.cppLabel_Comparator.cpp内(多个编译单元)皆定义了对象 BasicsProcess bp;

解决方法:

  • 另外弄个放全局对象的 .h 和 cpp,
  • 然后在要用到该bp对象的cpp文件中 #include "PublicObj.h" 即可 👇
// PublicObj.h #pragma once #include "BasicsProcess.h" extern BasicsProcess bp; // 仅声明,不分配内存 // PublicObj.cpp #include "PublicObj.h" BasicsProcess bp; // 实际定义

33、openCV4.5.5 相关

编译期间报错:test_qrcode_encode.cpp文件相关的报错

解决方案:将文件中的日文删除即可。

调用设置

可执行文件目录: opencv-4.5.5\build\install\x64\vc15\bin 包含目录: opencv-4.5.5\build\install\include opencv-4.5.5\build\install\include\opencv2 库目录: opencv-4.5.5\build\install\x64\vc15\lib

查看使用版本

#include <opencv2/opencv.hpp> #include <iostream> int main() { std::cout << "OpenCV version: " << CV_VERSION << std::endl; std::cout << "Major version: " << CV_MAJOR_VERSION << std::endl; std::cout << "Minor version: " << CV_MINOR_VERSION << std::endl; //std::cout << "Revision version: " << CV_REVISION << std::endl; cv::Mat img(100, 100, CV_8UC3, cv::Scalar(255, 0, 0)); std::cout << "OpenCV test: image created " << img.cols << "x" << img.rows << std::endl; //cv::waitKey(); system("pause"); return 0; }

34、【vsCode】报错:[rollbar] 未处理的异常: 未处理的拒绝承诺: build Error: ENOENT: no such file or directory, stat 'E:\S400QT5\SLM\build_release\.cmake\api\v1\reply\target-ALL_BUILD-Debug-3b84ea82e03ce205a090.json' {}

  • 现象:代码完全没改,有时候突然就运行不了了。
  • 报错
    • [rollbar] 未处理的异常: 未处理的拒绝承诺: build Error: ENOENT: no such file or directory, stat 'E:\S400QT5\SLM\build_release\.cmake\api\v1\reply\target-ALL_BUILD-Debug-3b84ea82e03ce205a090.json' {}
    • qt相关的头文件引用部分标红。
  • 本质:
    • VS Code + CMake 的缓存/配置彻底乱了,导致 IDE 连“该用哪个目标运行”都找不到,于是抛出了 “selectLaunchTarget Error: ENOENT ... cache-xxx.json。”错误。
    • 即:CMake 之前生成的配置缓存文件不见了或被删坏了,但 VS Code 还在试图用它。

解决步骤:

  1. 直接删除整个.cmake文件夹。如 E:\S400QT5\SLM\build_release\.cmake
  2. 让 CMake 重新生成索引:
    1. VSCodeCtrl+Shift+P
    2. 输入并选择:CMake: Configure
    3. 等待底部状态栏显示[CMake] Configuring done此时 CMake 会在build_release里重新生成一个全新的.cmake文件夹,里面会有正确的target-xxx.json文件。
  3. 选择启动目标并运行(即 重新运行即可)
    1. 在 VS Code 底部状态栏,点击“Select Launch Target”
    2. 选择你的可执行文件
    3. 点击 ▶️ 运行

over~

35、