将Crashpad与Windows Qt应用程序集成

fzsnzjdm  于 2023-03-31  发布在  Windows
关注(0)|答案(1)|浏览(242)

我们尝试将Crashpad与Qt应用程序集成,但遇到了一些错误。我们构建了Crashpad,并尝试使用.pro文件中的以下代码片段将其链接到我们的应用程序:

# 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
}

在构建时,我们得到了大量类似于以下的链接器错误:

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

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

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

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

7kqas0il

7kqas0il1#

这里的问题最终是工具集不匹配。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 {
    # Crashpad libraries
    LIBS += -L$$LIBDIR -lcommon
    LIBS += -L$$LIBDIR -lclient
    LIBS += -L$$LIBDIR -lutil
    LIBS += -L$$LIBDIR -lbase

    # System libraries
    LIBS += -lAdvapi32
}

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

关闭全程序优化可以通过将/GL-添加到extra_cflags来完成。以下代码片段在Windows CMD中有效(在PowerShell中无效):

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

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

相关问题