gpt4 book ai didi

c++ - OpenCV 2.4.1 与 Qt 的静态链接

转载 作者:太空狗 更新时间:2023-10-29 21:46:00 25 4
gpt4 key购买 nike

我已经使用 MinGW 和 CMake 静态编译 OpenCV 2.4.1 没有错误。我检查了 With_QT
我只是取消选中 BUILD_SHARED_LIBS 并继续 mingw32-makemingw32-make install

它的构建没有错误,最终我在 opencv 的 lib 文件夹中有一堆 .a 文件。

但是在设置 .pro 文件的 LIBS and INCLUDEPATH 参数并在 Qt 中运行一个简单的应用程序后,我遇到了错误。

我还将以下行添加到 .pro 文件中:

CONFIG += -static -static-libgcc

我提供了最后一行错误:
F:\OpenCV2.4.1\opencv-static\install\lib\libopencv_highgui241.a(grfmt_jpeg2000.cpp.obj):grfmt_jpeg2000.cpp:(.text$_ZN2cv13Jpeg2KDecoder10readHeaderEv+0x4f):
undefined reference to `jas_image_decode' collect2: ld returned 1
exit status mingw32-make[1]: ***

[release\test.exe] Error 1
mingw32-make: *** [release] Error 2 The process "C:/ming44/bin/mingw32-make.exe" exited with code %2. Error while building project test (target: Desktop) When executing build step 'Make'

更新

我发现错误就在我调用 highgui.hpp 方法时。像我使用 cv::imshow() 时出现以下错误:
F:\OpenCV2.4.1\opencv-static2\install\lib\libopencv_highgui241.a(window_w32.cpp.obj):window_w32.cpp:(.text$_ZL17icvCreateTrackbarPKcS0_PiiPFviEPFviPvES4_+0x5e1): undefined reference to `CreateToolbarEx@52'  collect2: ld returned 1
exit status mingw32-make[1]: *** [release\test.exe] Error 1
mingw32-make: *** [release] Error 2

谁能帮我解决这个问题。

谢谢

最佳答案

我们在修复过程中遇到了很多问题,因此我将尝试在此处总结所有问题的答案。

Unresolved 符号

undefined reference to `jas_image_decode'
jas_image_decode 符号在 libjasper(它是 OpenCV 的第 3 方依赖项)中定义。要解决它,请链接 libjasper.a
undefined reference to `CreateToolbarEx@52'
CreateToolbarEx 符号是 Windows API 的一部分,因此在系统库中定义(在您的情况下,系统库总是随工具链一起提供)。通过查看 MSDN(向下滚动并查看 DLL 单元),您始终可以找到应该链接到哪个库来解析此类符号。在这种情况下,您可以看到 Comctl32.lib ,但是 MSDN 当然会以 Microsoft Visual C 工具链定义它们的格式发布库的名称。由于您使用的是 MinGW 工具链,因此您必须(精神上)将此名称转换为库的 Unix 命名约定,在本例中为 libcomctl32.a
undefined reference to `AVIStreamRelease@4'

与前一种情况类似,我们发现它是 here ,并推断我们必须链接到 libvfw32.a

注意: 工具链始终会自动搜索此类系统库(包含 Windows API)的路径。因此,您不应在编译/链接期间提供 -L 选项,而应仅提供库本身,即 -lcomctl32
undefined reference to `cv::dft'

嗯,这又是来自 OpenCV 的一些组件( cv 命名空间显然表明了这一点)。稍微搜索一下就会发现它是在 Core component 中定义的。因此,要解析该符号,请链接 libopencv_core.a

该方法

How do I find out which library to link against to resolve the missing symbol?



这里没有经验法则或任何直接的配方,而是一些主要来自经验的技巧和有根据的猜测。这里有一些例子:
  • 例如,在 CreateToolbarEx 的情况下,对我来说很容易
    猜测它属于 Windows API,只要我认出
    函数名称的 Windows API 命名约定。最后,
    我接下来要做的是在 Google 中输入 CreateToolbarEx,跳转到
    MSDN上的相应页面,向下滚动,看看库名是什么
    是,将(精神上)转换为库的 Unix 命名约定(见上文),
    瞧!
  • OpenCV 的情况比较棘手。 OpenCV 是第 3 方库和
    找出图书馆在哪里会很痛苦的问题
    某些符号的定义完全取决于质量
    提供的文件。虽然,我可以看到 OpenCV
    文档很不错,还是缺少这些重要的
    每个符号都有提示,这很遗憾。但是,我们(开发人员)
    必须能够处理这样的问题,不管如何
    糟糕的 3rd 方库的文档是,并完成工作。

    这就是为什么使用文件内容搜索实用程序总是一个好主意
    例如 grep(在 Unix OS 系列上很流行,但可用于 Windows
    MSYS 发行版中也是如此)。这样,例如在cv::dft ,你可以在根目录下运行 grep -r "void.*dft(" .OpenCV 源代码树,并追踪该符号的定义位置
    没时间。之后,您必须推断该文件是哪个组件
    包含 cv::dft 所属,但这应该很简单,看看
    并查看文件所在的目录。

  • 结论

    我发誓我一生中从未使用过 OpenCV,但是正如您所看到的,我仍然能够为您找到所有这些丢失的符号。因此,我们可以得出结论,所提出的搜索未解析符号的技术是可靠的。

    最后,这一切都不是 OpenCV 或 Qt 特有的。你在这里处理基本的程序员工艺技能。如果您想成为能够快速解决此类日常例程的高效软件开发人员,那么 grep 只是众多必不可少的实用程序之一,毫无疑问,它应该成为您工具库的一部分。

    关于c++ - OpenCV 2.4.1 与 Qt 的静态链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16176396/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com