【问题标题】:Qt application cannot find a 3rd party DLL and crashesQt 应用程序找不到第 3 方 DLL 并崩溃
【发布时间】:2018-09-18 22:52:37
【问题描述】:

我正在尝试在 QT 中构建一个使用 libmodbus 库的应用程序。我正在使用 MinGW 5.3 (Windows 7)。该应用程序将在没有错误的情况下构建,但在尝试运行时会崩溃。调试消息说:

在启动过程中程序退出,代码为 0xc0000135

如果我双击创建的可执行文件,有一个错误提示:

libmodbus-5.dll 丢失

来自我的电脑。

Libmodbus 是使用相同的编译器构建的。包含文件位于../../codelibrary/MinGW63/libmodbus-master/src,链接器文件位于../../codelibrary/QtMinGW53/libmodbus-master/src/.libs.libs 文件夹同时包含libmodbus.dll.alibmodbus-5.dll)。

如果我使用 Qt 的 3rd 方库向导添加这个库,那么我会在我的 .pro 文件中得到以下内容:

win32: LIBS += -L$$PWD/../../codelibrary/QtMinGW53/libmodbus-master/src/.libs/ -llibmodbus.dll

INCLUDEPATH += $$PWD/../../codelibrary/QtMinGW53/libmodbus-master/src
DEPENDPATH += $$PWD/../../codelibrary/QtMinGW53/libmodbus-master/src

win32:!win32-g++: PRE_TARGETDEPS += $$PWD/../../codelibrary/QtMinGW53/libmodbus-master/src/.libs/libmodbus.dll.lib
else:win32-g++: PRE_TARGETDEPS += $$PWD/../../codelibrary/QtMinGW53/libmodbus-master/src/.libs/liblibmodbus.dll.a

这给了我错误:

-1: 错误:没有规则可以创建目标 '../../codelibrary/MinGW63/libmodbus-master/src/.libs/liblibmodbus.dll.a',这是 'debug\QTRosemount.exe' 所需要的。停下来。

然后我尝试将.pro 文件更改为:

LIBS += -L$$PWD/../../codelibrary/QtMinGW53/libmodbus-master/src/.libs/libmodbus-5.dll

INCLUDEPATH += $$PWD/../../codelibrary/QtMinGW53/libmodbus-master/src
DEPENDPATH += $$PWD/../../codelibrary/QtMinGW53/libmodbus-master/src

PRE_TARGETDEPS += $$PWD/../../codelibrary/QtMinGW53/libmodbus-master/src/.libs/libmodbus.dll.a

此时它将无错误地构建并立即崩溃,代码为 0xc0000135 和缺少的libmodbus-5.dll。我已经尝试了许多.pro 路径的变体,它们都得到了同样的错误。

注意:我已经能够使用这个库在 Codeblocks 中运行控制台应用程序,但不确定我在 Qt 中遇到了什么。

如何解决这个问题?

【问题讨论】:

  • 希望不会误导您,但是,如果手动将 DLL 复制到可执行目录可以修复可执行崩溃(意味着所有链接/构建都是正确的),您是否考虑过添加 INSTALL 或 QMAKE_PRE_LINK到copy the dll to the output location?
  • 手动复制 DLL,谢谢!使用 3rd 方库时添加 INSTALL 或 QMAKE_PRE_LINK 参数是常见做法吗?
  • 警告,我自以为是! QMake 在QtCon 2016 被设置为弃用。这使得很多工程师转向 CMake,而 QtCreator 很好地支持了 CMake。我使用过的组织最好的 Qt 项目是使用 INSTALL 而不是 QMAKE_PRE_LINK,如 official Qt docs 所示。此外,我还看到 .pri files 被用来提高 .pro 文件的可读性,并有助于在各种项目中重新包含常见的第三方库。

标签: c++ qt


【解决方案1】:

您可以使用 INSTALL SET 并将其附加到 INSTALL 列表中,如QT documentation 所示,如下图所示:

documentation.path = /usr/local/program/doc
documentation.files = docs/*
INSTALLS += documentation

为方便起见,您也可以使用QMAKE_PRE_LINK。现在您有了一些选择,您可以在 stackoverflow 中找到更多信息,例如 posts like this one

【讨论】:

    【解决方案2】:

    另外,我发现 DEPENDPATH 不正确。我在 libmodbus 中有一个需要指向的文件夹:

    DEPENDPATH += $$PWD/../../codelibrary/QtMinGW53/libmodbus-master/src/.deps
    

    修改后程序可以正确编译

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      相关资源
      最近更新 更多