我已经安装了Qt,但是在尝试从QtCreator中调试C ++代码时遇到了错误。我在Windows上使用Visual Studio 2017,似乎没有安装QtCreator需要的调试器(cdb.exe)。在使用MSVC2017编译器时,如何配置调试以在QtCreator中使用64位代码?
(我根据https://stackoverflow.com/help/self-answer回答了我自己的问题。发布一个更好的答案,我会改变你接受的答案!)
答案 0 :(得分:37)
我在这里讨论的是让QtCreator使用Visual Studio 2017(MSVC2017)编译器 - 包括调试!默认安装MSVC2017和Qt 5.10将允许您编译和运行代码,但默认情况下您不会获得调试支持。我将展示为以下参考系统安装所有内容(包括调试支持)所需的步骤:
我已经在Windows 10和Windows 7(x64)上测试了这些步骤,它似乎正在运行。请注意,与Qt安装程序捆绑在一起的QtCreator版本是32位版本,如果您尝试使用MSVC进行调试,它将无法开箱即用。这是记录在案的,但不是一步一步的(请参阅QtCreator Windows Debugging和QtCreator Debugger Engines),而不是所有内容都在一个地方,因此我将在此处提供有关如何获取的简单说明我在上面描述的参考系统工作的东西。
假设您已安装Win7 / Win10和MSVC2017,请开始使用!
安装适用于Windows 10的Windows SDK - https://developer.microsoft.com/en-us/windows/downloads/sdk-archive
安装这两个文件(x86版本是可选的):
注意:如果在安装Windows调试工具后安装QtCreator,QtCreator将自动检测调试器的位置,从而在创建工具包时省去麻烦。如果您已经安装了QtCreator,请不要担心,在QtCreator中配置套件如下所示。
在QtCreator用语或术语中," Kit"是调试器+编译器+ Qt版本+其他的组合。 (在这个意义上,单词" Kit"并不意味着和#34; Windows Kits"当我们在上面安装调试器时这是一样的;这是一个不幸的名称冲突。)一个" QtCreator Kit"通过选择工具 - >选项 - >建设与发展跑。我喜欢从最右边的标签开始,向左侧工作,结束于"套件。"原因是需要配置下面的所有标签(1,2,3)才能制作完整的套件。
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe
,并为其命名为" Window Kit 10 cdb x64"。设置编译器。确保" Microsoft Visual C ++编译器15.0(amd64)"在列表中。请注意,如果您已将内容安装到默认路径,QtCreator将自动检测这些位置。如果没有列出编译器,请添加路径。
请注意,对于Visual Studio 2017 x64位,您需要" amd64"版本,这是64位编译器。如果你想知道为什么列出这么多的编译器 - 它们是#34;交叉编译器。"这意味着他们针对不同的架构,例如," x86_amd64"是一个32位进程,创建一个64位应用程序;如果您在32位计算机上开发64位代码(因此称为交叉编译),您将使用此版本。由于本教程假定您在64位操作系统上运行,因此请使用amd64版本。 (" x86_amd64"交叉编译器也将生成64位代码。)当我第一次看到QtCreator中的巨大编译器选择列表时,我并不知道要选择哪一个。现在你也知道了!请参阅When compiling x64 code, what's the difference between "x86_amd64" and "amd64"?。
让我们有一些乐趣并编写一个64位程序,然后进行调试。一个好的测试是分配大量内存(典型的32位Windows进程限制为2GB,请参阅How much memory can a 32 bit process access on a 64 bit operating system?)。例如,分配32GB的RAM应该是一个积极的指标,我们确实在编译64位应用程序。以下是QtCreator调试64位Windows测试程序的屏幕截图:
请注意,我使用的是MSVC2017 64位编译器和上面提到的CDB.exe调试器。
#include <QCoreApplication>
#include <cassert>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int intSize = sizeof(int);
assert(intSize == 4);
int intPtrSize = sizeof(int*);
assert(intPtrSize == 8);
constexpr size_t giga = 1000 * 1000 * 1000;
size_t _32gigs = 32 * giga / intSize;
int* gigaChunk = new int[_32gigs];
assert(gigaChunk != nullptr);
return a.exec();
}