簡體   English   中英

將 Crashpad 與 Windows Qt 應用程序集成

[英]Integrating Crashpad with a Windows Qt application

我們正在嘗試將 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
}

在構建時,我們得到了大量類似於以下的 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
}

編輯:重新訪問后,我們發現另一個解決方案是關閉整個程序優化,它允許您混合和匹配 MSVC 構建 Crashpad 和 Qt 的版本。

可以通過將/GL-添加到extra_cflags來關閉整個程序優化。 以下代碼段適用於Windows CMD (不適用於 PowerShell):

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

可以在此處找到與 Crashpad 集成的示例 Windows Qt 應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM