【发布时间】: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.a 和libmodbus-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 文件的可读性,并有助于在各种项目中重新包含常见的第三方库。