将 Crashpad 与 Windows Qt 应用程序集成

Integrating Crashpad with a Windows Qt application

我们正在尝试将 Crashpad 与我们的 Qt 应用程序集成,但 运行 出现了几个错误。我们构建了 Crashpad 并尝试使用 .pro 文件中的以下代码片段 link 将其添加到我们的应用程序中:

# Crashpad rules for Windows
win32 {
    LIBS += -L$$PWD/Crashpad/Libraries/Windows/ -lbase
    LIBS += -L$$PWD/Crashpad/Libraries/Windows/ -lclient
    LIBS += -L$$PWD/Crashpad/Libraries/Windows/ -lutil
}

构建时,我们遇到了大量 linker 错误,类似于以下内容:

base.lib(base.file_path.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in main.obj

我们看到了这个 并决定使用 /MDd 标志构建 Crashpad。将新库复制到上面列出的目录中后,使用 Qt 构建产生了以下错误:

fatal error C1007: unrecognized flag '-Ot' in 'p2'

为什么 MSVC 会抛出这个错误?我们正在使用 14.0 MSVC 工具集进行构建。

这里的问题最终是工具集不匹配。 Ninja 使用 MSVC 2019 工具集构建了 Crashpad。问题机器上安装的 Qt 版本是 5.14.2,它使用 MSVC 2017 工具集。一旦我们安装了 5.15.0 套件并使用 MSVC 2019 构建配置构建,这个错误就消失了。

此外,在我们解决了之前的错误后,又出现了 4 个新错误:

util.lib(util.registration_protocol_win.obj) : error LNK2001: unresolved external symbol __imp_BuildSecurityDescriptorW
util.lib(util.registration_protocol_win.obj) : error LNK2001: unresolved external symbol ConvertStringSecurityDescriptorToSecurityDescriptorW
util.lib(util.registration_protocol_win.obj) : error LNK2001: unresolved external symbol __imp_BuildExplicitAccessWithNameW
base.lib(base.rand_util.obj) : error LNK2001: unresolved external symbol SystemFunction036

这些错误已通过链接 Advapi32:

解决
# Crashpad rules for Windows
win32 {
    LIBS += -L$$PWD/Crashpad/Libraries/Windows/ -lbase
    LIBS += -L$$PWD/Crashpad/Libraries/Windows/ -lclient
    LIBS += -L$$PWD/Crashpad/Libraries/Windows/ -lutil
    LIBS += -lAdvapi32
}

编辑: 重新审视后,我们发现另一个解决方案是关闭 Whole Program Optimization,它允许您混合和匹配 MSVC 构建 Crashpad 和 Qt 的版本。

关闭整个程序优化可以通过将 /GL- 添加到 extra_cflags 来完成。以下代码片段适用于 Windows CMD(不适用于 PowerShell):

gn gen out\MD --args="extra_cflags=\"/MD /GL-\""

可以找到与 Crashpad 集成的示例 Windows Qt 应用程序 here