c++ - 使用 Qt 5.12 在 OpenCV dll 上找不到入口点

TLDR:将 OpenCV 与 QT MingW 链接会使应用程序在调试中崩溃,但不会在发布时崩溃。

我正在尝试在基于 Qt 的大型多操作系统项目中使用 OpenCV。我已经轻松地为 Mac 和 Linux 构建了 OpenCV,但我很难在 Windows 上使用它。

环境:

Qt 5.12.2 MinGW

MinGW 8.1.0 64 位

OpenCV 基本上是 4.1.0 之后的所有版本

CMake 3.19

我尝试过的

  • 我首先尝试按照他的链接 https://wiki.qt.io/How_to_setup_Qt_and_openCV_on_Windows 从源代码构建 OpenCV但在调试中运行应用程序时遇到一些问题,例如在 opencv 库中找不到入口点(下面的确切错误)

  • 我最近使用 MSys2 的 pacman 预构建包并尝试了 4.2 到 4.5 版本,但没有真正成功。我设法从 msys 的安装路径 (C:\msys64\mingw64\bin) 链接了 OpenCV 库,并且在环境 PATH 中使用这个路径我能够使用 Qt 生成的 .exe 启动应用程序。但是,一旦我将所需的库拖到我们的第三方库文件夹中进行部署,应用程序就无法再在调试中启动(使用 Qt 或 .exe)。

  • 我试过 Release 模式,一切正常

现在每次我在 Debug with Qt 中运行应用程序时,程序都会立即崩溃,甚至没有进入 main.我在使用 .exe 时出现以下错误:

我发现这可能是一个 TBB 问题,所以我尝试使用与 MSys 不同的版本,但没有成功。

我试图从 Qt 更改 PATH 变量以用于构建和运行,但没有成功。

我的 .pri 中的 include 和 Libs 如下使用(它们都是在构建过程中找到的)

INCLUDEPATH += -I $$PWD/../../ext/OpenCV/include/opencv4
DEPENDPATH += -$$PWD/../../ext/OpenCV/include/opencv4

LIBS += -L$$PWD/../../ext/OpenCV/lib/$$OSFOLDER/$$ARCHFOLDER  -lopencv_imgproc430
LIBS += -L$$PWD/../../ext/OpenCV/lib/$$OSFOLDER/$$ARCHFOLDER  -lopencv_core430
LIBS += -L$$PWD/../../ext/OpenCV/lib/$$OSFOLDER/$$ARCHFOLDER  -lopencv_dnn430
LIBS += -L$$PWD/../../ext/OpenCV/lib/$$OSFOLDER/$$ARCHFOLDER  -lopencv_imgcodecs430
LIBS += -L$$PWD/../../ext/OpenCV/lib/$$OSFOLDER/$$ARCHFOLDER  -lopencv_highgui430

最佳答案

好吧,我终于成功了! 正如我在问题中所说,当 TBB 版本不正确时,有时会发生此错误,所以这就是我所做的:

  • 使用此存储库手动构建 TBB:https://github.com/wjakob/tbb其中包含官方存储库的基于 CMake 的构建系统:https://github.com/oneapi-src/oneTBB

  • 使用稍后将在您的应用程序中使用的编译器构建具有所需版本的 OpenCV:

    • 取消选中“BUILD_TBB”,选中“WITH_TBB”并指向之前构建的 TBB 库并包含。
    • 添加您需要的标志(例如 OPENCV_ENABLE_ALLOCATOR_STATS=OFF)并构建它。
  • 最后从“path/to/opencv-build/bin”而不是“path/to/opencv-build/install/bin”添加库(也许这是我们应该一直做的,但我不是当然),它对我有用!

https://stackoverflow.com/questions/65219534/

相关文章:

r - 作为二进制变量处理

python - ImportError : numpy. core.multiarray 导入失败

javascript - 如何通过输入字段更改 slider ?

powershell - Unity.exe 命令行构建需要 10 分钟,而编辑器只需不到一分钟

ios - 使用 NSPersistentCloudKitContainer 处理重复项

c# - 接口(interface)成员中定义的可空引用类型在实现中不需要为可空的原因是什么?

google-workflows - 如何在工作流中获取执行ID

c++ - FetchContent 与 ExternalProject

google-apps-script - 无法获取部署 ID 错误的详细信息

type-conversion - terra 包的函数 rast 不适用于 RasterLayer