Почему возникает ошибка компоновщика 2019 при ссылке на GoogleBreakpad?

После нескольких часов поиска этой ошибки компоновщика это не увенчалось успехом :(

Действия по воспроизведению:

  1. Установите gyp и PATH
  2. Открыть VS2015 x86 Native Tools Command Prompt
  3. Run:
    • git clone https://chromium.googlesource.com/breakpad/breakpad && cd breakpad
    • cd src && git clone https://github.com/google/googletest testing && cd ..
    • gyp -–no-circular-check src\client\windows\breakpad_client.gyp
  4. Открыть src\client\windows\breakpad_client.sln
  5. Перейдите к проектам Properties>C/C++/General и измените Treat Warnings As Errors на No для конфигурации crash_generation_client, common, exception_handler для Debug и Release конфигурации.
  6. Перейдите к проектам Properties>C/C++/General и измените Treat wchar_t as Built-in Type на No для конфигурации crash_generation_client, common, exception_handler для Debug и Release.
  7. Построить все для Debug
  8. Построить все для Release
  9. Свяжите библиотеки, расположенные в breakpad\src\client\windows\Debug\lib и breakpad\src\client\windows\Release\lib, с вашим приложением, в моем случае файл Qt qmake, как показано ниже:
win32:debug {
    BREAKPAD_PATH = $$PWD/../../../LIBS/breakpad
    INCLUDEPATH += $$BREAKPAD_PATH/src
    LIBS += -L$$BREAKPAD_PATH/client/windows/Debug/lib/crash_generation_client.lib
    LIBS += -L$$BREAKPAD_PATH/client/windows/Debug/lib/exception_handler.lib
    LIBS += -L$$BREAKPAD_PATH/client/windows/Debug/lib/common.lib
    PRE_TARGETDEPS += $$BREAKPAD_PATH/client/windows/Debug/lib/crash_generation_client.lib
    PRE_TARGETDEPS += $$BREAKPAD_PATH/client/windows/Debug/lib/exception_handler.lib
    PRE_TARGETDEPS += $$BREAKPAD_PATH/client/windows/Debug/lib/common.lib
} else:release {
    BREAKPAD_PATH = $$PWD/../../../LIBS/breakpad
    INCLUDEPATH += $$BREAKPAD_PATH/src
    LIBS += -L$$BREAKPAD_PATH/client/windows/Release/lib/crash_generation_client.lib
    LIBS += -L$$BREAKPAD_PATH/client/windows/Release/lib/exception_handler.lib
    LIBS += -L$$BREAKPAD_PATH/client/windows/Release/lib/common.lib
    PRE_TARGETDEPS += $$BREAKPAD_PATH/client/windows/Release/lib/crash_generation_client.lib
    PRE_TARGETDEPS += $$BREAKPAD_PATH/client/windows/Release/lib/exception_handler.lib
    PRE_TARGETDEPS += $$BREAKPAD_PATH/client/windows/Release/lib/common.lib
}
  1. Компоновщик должен вывести следующую ошибку:
    #P3#

crash_handler.h:

#ifndef _CRASH_HANDLER_H
#define _CRASH_HANDLER_H

namespace breakpad {

    class CrashHandlerPrivate;

    class CrashHandler {
    public:
        static CrashHandler* instance();
        void init(const QString&  reportPath);

        void setReportCrashesToSystem(bool report);
        bool writeMinidump();

    private:
        CrashHandler();
        ~CrashHandler();

    private:
        CrashHandlerPrivate* d;
        Q_DISABLE_COPY(CrashHandler)
    };

} // namespace breakpad

#endif // !_CRASH_HANDLER_H

crash_handler.cpp

#include "crash_handler.h"

#if defined(Q_OS_LINUX)
#include "client/linux/handler/exception_handler.h"
#elif defined(Q_OS_WIN32)
#include "client/windows/handler/exception_handler.h"
#endif

namespace breakpad {

    class CrashHandlerPrivate {
    public:
        CrashHandlerPrivate() {
            pHandler = NULL;
        }

        ~CrashHandlerPrivate() {
            delete pHandler;
        }

        void initCrashHandler(const QString& dumpPath);

    public:
        static google_breakpad::ExceptionHandler* pHandler;
        static bool bReportCrashesToSystem;
    };

    google_breakpad::ExceptionHandler* CrashHandlerPrivate::pHandler = NULL;
    bool CrashHandlerPrivate::bReportCrashesToSystem = false;

    /************************************************************************/
    /* DumpCallback                                                         */
    /************************************************************************/
#if defined(Q_OS_WIN32)
    bool DumpCallback(const wchar_t* _dump_dir, const wchar_t* _minidump_id, void* context, EXCEPTION_POINTERS* exinfo, MDRawAssertionInfo* assertion, bool success)
#elif defined(Q_OS_LINUX)
    bool DumpCallback(const google_breakpad::MinidumpDescriptor &md, void *context, bool success)
#endif
    {
        Q_UNUSED(context);
#if defined(Q_OS_WIN32)
        Q_UNUSED(_dump_dir);
        Q_UNUSED(_minidump_id);
        Q_UNUSED(assertion);
        Q_UNUSED(exinfo);
#endif
        qDebug("BreakpadQt crash");

        /*
        NO STACK USE, NO HEAP USE THERE !!!
        Creating QString's, using qDebug, etc. - everything is crash-unfriendly.
        */
        return CrashHandlerPrivate::bReportCrashesToSystem ? success : true;
    }

    void CrashHandlerPrivate::initCrashHandler(const QString& dumpPath)
    {
        if (pHandler != NULL)
            return;

#if defined(Q_OS_WIN32)
        std::wstring pathAsStr = (const wchar_t*)dumpPath.utf16();
        pHandler = new google_breakpad::ExceptionHandler(
            pathAsStr,
            /*FilterCallback*/ 0,
            DumpCallback,
            /*context*/
            0,
            true
        );
#elif defined(Q_OS_LINUX)
        std::string pathAsStr = dumpPath.toStdString();
        google_breakpad::MinidumpDescriptor md(pathAsStr);
        pHandler = new google_breakpad::ExceptionHandler(
            md,
            /*FilterCallback*/ 0,
            DumpCallback,
            /*context*/ 0,
            true,
            -1
        );
#endif
    }



    CrashHandler* CrashHandler::instance() {
        static CrashHandler globalHandler;
        return &globalHandler;
    }

    CrashHandler::CrashHandler() {
        d = new CrashHandlerPrivate();
    }

    CrashHandler::~CrashHandler() {
        delete d;
    }

    void CrashHandler::setReportCrashesToSystem(bool report) {
        d->bReportCrashesToSystem = report;
    }

    bool CrashHandler::writeMinidump() {
        bool res = d->pHandler->WriteMinidump();
        if (res) {
            qDebug("BreakpadQt: writeMinidump() success.");
        } else {
            qWarning("BreakpadQt: writeMinidump() failed.");
        }
        return res;
    }

    void CrashHandler::init(const QString& reportPath) {
        d->initCrashHandler(reportPath);
    }

} // namespace breakpad

Неужели не знаю в чем проблема?!

Конфигурация:

  • OS: Windows 10(1809)

  • Система сборки: MSVC14.0(2015)

  • Версия Qt: 5.8(32bit)


person IMAN4K    schedule 16.08.2019    source источник
comment
Удаление тега C++ как вопроса действительно не имеет ничего общего с C++. Это вопрос для поддержки breakpad.   -  person SergeyA    schedule 16.08.2019
comment
@IMAN4K столкнулся с той же проблемой, вы смогли ее решить?   -  person vava044    schedule 19.05.2021
comment
Я довольно давно не работаю с платформой win32, но убедитесь, что вы правильно построили блокнот, как указано здесь github.com/telegramdesktop/tdesktop/blob/v2.4.13/docs/, а остальное — ссылка на него   -  person IMAN4K    schedule 20.05.2021