Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV 2.4.1与Qt的静态链接_C++_Opencv_Static Libraries_Static Linking_Undefined Reference - Fatal编程技术网

C++ OpenCV 2.4.1与Qt的静态链接

C++ OpenCV 2.4.1与Qt的静态链接,c++,opencv,static-libraries,static-linking,undefined-reference,C++,Opencv,Static Libraries,Static Linking,Undefined Reference,我已经使用MinGW和CMake静态编译了opencv2.4.1,没有错误。我用QT检查了 我刚刚取消选中了BUILD\u SHARED\u LIBS,然后继续mingw32 make和mingw32 make install 它是毫无错误地构建的,最终我在opencv的lib文件夹中有了一堆.a文件 但是在设置.pro文件的LIBS和INCLUDEPATH参数并在Qt中运行一个简单的应用程序之后,我出现了错误 我还将以下行添加到.pro文件中: CONFIG += -static -stati

我已经使用MinGW和CMake静态编译了opencv2.4.1,没有错误。我用QT检查了

我刚刚取消选中了
BUILD\u SHARED\u LIBS
,然后继续
mingw32 make
mingw32 make install

它是毫无错误地构建的,最终我在opencv的lib文件夹中有了一堆
.a
文件

但是在设置.pro文件的
LIBS和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()时出现的以下错误一样:

谁能帮我解决这个问题


谢谢

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

未解析符号
jas\u image\u decode
符号在中定义(这是OpenCV的第三方依赖项)。要解决此问题,请链接libjasper.a

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

undefined reference to `CreateToolbarEx@52'
undefined reference to `AVIStreamRelease@4'
与前面的案例类似,我们找到了它,并推断我们必须链接到
libvfw32.a

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

undefined reference to `cv::dft'
好的,这也是OpenCV中的一些组件(
cv
namespace显然表明了这一点)。稍微搜索一下就会发现它是在中定义的。因此,要解析该符号,请链接
libopencv\u core.a

undefined reference to `CreateToolbarEx@52'
undefined reference to `AVIStreamRelease@4'
方法
如何找到要链接的库以解决缺少的符号

这里没有经验法则或任何直接的配方,而是一些主要来自经验的技巧和有根据的猜测。以下是几个例子:

  • 例如,对于
    CreateToolbarEx
    ,这对我来说相当容易 只要我能认出 函数名的Windows API命名约定。因此,, 接下来我要做的是在Google中键入
    CreateToolbarEx
    ,跳转到 在MSDN的相应页面上,向下滚动,查看库名称 是,转换为库的Unix命名约定(见上文), 瞧

  • OpenCV的情况更加棘手。OpenCV是一个第三方库和 问题是找到图书馆在哪里会不会很痛苦 某些符号的定义完全取决于符号的质量 提供的文件。虽然,我可以看到OpenCV 文档非常好,但仍然缺少这些重要的 每个符号都有提示,这很遗憾。但是,我们(开发人员) 无论怎样,都必须能够处理这样的问题 第三方库的文档很糟糕,可以完成工作

    这就是为什么使用文件内容搜索工具总是一个好主意 例如
    grep
    (在Unix操作系统系列上很流行,但适用于Windows 也在发行中)。这样,例如在
    cv::dft
    ,您可以在 OpenCV源代码树,并跟踪该符号在中的定义位置 没有时间。在那之后,你必须推断出文件是哪个组件 包含
    cv::dft属于,但这应该很简单,只要看一下就可以了
    查看文件所在的目录

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


    最后,这些都不是OpenCV或Qt所特有的。您在这里学习的是基本的程序员技能。如果您想成为一名高效的软件开发人员,能够快速解决这些日常例行程序,那么
    grep
    只是众多基本实用程序中的一个,毫无疑问,它应该是您的工具库的一部分。

    很明显,您忘记了链接OpenCV的第三方依赖项。您甚至构建了它吗?如果您构建了,那么也只需链接它。我认为错误消息很明显,例如,我从未使用过OpenCV,但通过查看他们的存储库,我立即了解了您的问题所在以及如何修复它。因此问题是:你确定你了解链接是如何工作的吗?@Haroogan我在构建opencv时选中了BUILD_JASPER选项。但是没有创建lib文件。我认为这个过程类似于在共享模式下构建。查看,向下滚动,看到这个符号是在
    Comctl32.lib
    Comctl32.dll
    中定义的。否w、 你猜怎么着?也许是时候和这些链接中的一个链接了(这样符号就可以解决了)?次要问题仍然没有解决,因为你不能一次又一次地解决这个简单的问题。@Haroogan谢谢。我知道静态链接是如何工作的。我的pr