【问题标题】:build a standalone exe file form a QT+openCV project running in QT Creator从 QT Creator 中运行的 QT+openCV 项目构建一个独立的 exe 文件
【发布时间】:2020-10-06 13:35:53
【问题描述】:

我最近刚刚在 QT Creator 框架中编写了一个项目,它既使用 QT 库(如 QT_Widget),也使用 openCV 库(如 openCV_tracking)。 我的项目包括 .ui 、 .pro 、 main.cpp 和一些带有 .h 和 .cpp 文件的类。

我的 .pro 文件是:

QT       += \
        core gui \
        concurrent widgets

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Version7
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS

#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

CONFIG += \
   c++11 \
   cmdline

SOURCES += \
    main.cpp \
    mainwindow.cpp \
    videoprocessor.cpp \
    robottracker.cpp \
    robotdetector.cpp \
    obstaclesdetector.cpp \
    pathcapture.cpp

HEADERS += \
    mainwindow.h \
    videoprocessor.h \
    robottracker.h \
    robotdetector.h \
    obstaclesdetector.h \
    pathcapture.h

FORMS += \
    mainwindow.ui

# including openCV needed files
INCLUDEPATH += E:\\MyOpenCV\\install\\include
INCLUDEPATH += C:\\openCV\\opencv\\build\\include
LIBS += -LE:\\MyOpenCV\\install\\x64\\vc15\\lib \
           -lopencv_tracking430
LIBS += -LC:\\openCV\\opencv\\build\\x64\\vc15\\lib \
           -lopencv_world430

# Default rules for deployment.
 qnx: target.path = /tmp/$${TARGET}/bin
 else: unix:!android: target.path = /opt/$${TARGET}/bin
 !isEmpty(target.path): INSTALLS += target

它在 QT creator 中运行没有问题;但现在我想与我的团队分享它,为此我想从中构建一个独立的 exe 文件,该文件静态链接项目中使用的所有库。 有人可以指导我如何使用 QT Creator 或其他一些选项来做到这一点吗? 在互联网上有一些建议,但没有奏效。

【问题讨论】:

    标签: c++ qt opencv qt-creator static-linking


    【解决方案1】:

    我不久前尝试过,但最终放弃了,尽管这绝对是可能的。

    Qt 如此隐藏如何做到这一点的原因是他们更喜欢人们动态链接到他们的库,因为它既允许用户根据需要更新/更改 Qt dll 并且(我认为这是真正的原因)这使得开发人员正在使用他们的套件变得更加明显。

    我会引导你朝着我认为应该采取的方向前进,但不幸的是我不太确定你会取得多大的成功。

    1. 首先您需要静态构建实际的 Qt 库。我假设您使用 Qt Creator 附带的 MinGW 作为编译器。根据以下教程https://wiki.qt.io/Building_a_static_Qt_for_Windows_using_MinGW,您可以下载以下powershell脚本(确保您已安装powershell):https://sourceforge.net/p/qtlmovie/code/ci/v1.2.16/tree/build/windows-build-qt-static.ps1?format=raw。只要你在 C:\Qt 下安装了 Qt,并且在这个文件夹中有一个名为“Static”的子目录,你应该能够简单地运行这个脚本并等待 Qt 构建到那个文件夹中。

    2. 其次,您需要链接到应用程序中的 Qt 库。打开 Qt Creator,转到工具 > 选项 > “构建和运行”。 Qt 教程是这样说的:

    转到选项卡“Qt 版本”。在“qmake location”表中,必须有“Auto-detected”部分和“Manual”部分。在“自动检测”部分,应该有一行名为“Qt 5.5.0 MinGW 32bit C:\Qt\Qt5.5.0\5.5\mingw492_32\bin\qmake.exe”。 “手册”部分最初是空的。

    单击“添加”,浏览到 C:\Qt\Qt5.5.0\bin 并选择“qmake.exe”。版本名称自动设置为“Qt 5.5.0 (5.5.0)”。您应该设置一个更有意义的名称,例如“Qt 5.5.0 MinGW Static 32bit”

    然后转到“套件”选项卡。同样,必须有一个“自动检测”部分和一个最初为空的“手动”部分。点击“添加”。设置一个有意义的名称,例如“Desktop Qt 5.5.0 MinGW Static 32bit”。如果您遵循上述建议,请在“Qt 版本”字段中选择您的静态环境,命名为“Qt 5.5.0 MinGW Static 32bit”。

    1. 如果您遵循上述建议,请单击左上角的“添加套件”并选择名为“Desktop Qt 5.5.0 MinGW Static 32bit”的静态套件。

    应该是这样的。不幸的是,我无法自己尝试,但这应该是一般程序。很多教程看似冗长,但一般来说,如果您按部就班地进行操作,它们最终会奏效。

    另外,请注意他们没有在上述说明中引用“静态”目录。我认为这是不正确的,这就是他们实际所指的,所以也许可以尝试一下,尽管我不确定。

    祝你好运!

    【讨论】:

    • 谢谢你的回答,它帮了很多忙。我做了虽然不完全是你说的,但通过一些改变,我终于可以制作一个静态链接的 QT 项目。但是现在当我将 openCV 包含到我的项目中时,对于我在项目中使用的所有 opencv 模块,我收到一条错误消息,上面写着“未定义对 'cv::* 的引用”。互联网上对此一无所知。如果你知道我应该做什么,请帮助我。谢谢。
    • 没问题!如果我提供帮助,请不要忘记选择最佳答案 ;)。您是否链接到 OpenCV 库?您需要添加 LIBS += -L{path_to_opencv} -l{opencv_library_filename}。查看本教程:stackoverflow.com/questions/47611221/…
    • 是的,我做到了,它实际上适用于原始 QT 文件夹中的原始 QT qmake.exe (C:\\Qt\\5.14\\msvc17_x64\\bin) 和 msvc17 编译器 (我使用的旧配置创建动态链接应用程序),但是当我创建另一个工具包时,它的 qmake.exe 位于 C:\\Qt\\static\\bin 中,首先我必须重命名所有库,例如 libQWidgets。 a 到其 lib 目录中的 QWIdgets.lib (之后它工作!),其次它不再找到 opencv 模块(未定义的引用...)。你知道为什么会这样吗?
    • 我相信这是因为 MINGW,因为我在动态链接空间上进行了测试,但这次使用 mingw 编译器,它也报告了该错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多