链接 OpenCV 4.1.0,包括工作,库不

Posted

技术标签:

【中文标题】链接 OpenCV 4.1.0,包括工作,库不【英文标题】:Linking OpenCV 4.1.0, include works, libs doesn't 【发布时间】:2019-03-19 13:41:33 【问题描述】:

在将 Ubuntu 从 16.04 更改为 18.04 并将 OpenCV 从 3.4.1 更改为 4.1.0 之后,我无法编译...任何东西

一步一步:

我从 github 下载源代码,设置这些标志:

cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules cmake -DENABLE_PRECOMPILED_HEADERS=OFF -DBUILD_opencv_cudacodec=OFF -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_CUDA=ON -D WITH_TBB=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D WITH_QT=OFF -D BUILD_SHARED_LIBS=OFF ..

编译并安装

接下来,我创建了一个简单的程序:

#include "opencv2/highgui.hpp"
#include <opencv2/imgproc.hpp>
#include <iostream> 

using namespace cv; 
using namespace std; 

int main() 
 
    cout << "V: " << CV_VERSION << endl;
    return 0; 

用这个命令编译它:

g++ -std=c++11 main.cpp `pkg-config --libs --cflags opencv4` -g -o main

并获得工作的可执行 main:

V: 4.1.0-pre

但是当我用 Mat 添加一行时

#include "opencv2/highgui.hpp"
#include <opencv2/imgproc.hpp>
#include <iostream> 

using namespace cv; 
using namespace std; 

int main() 
 
    cout << "V: " << CV_VERSION << endl;
    Mat frame;
    return 0; 

我遇到的错误比我的终端显示的要多

我想,像 libopencv_core.a 这样的文件没有链接

这种链接库的方法一直对我有用,我不知道在哪里寻找错误

任何线索,建议?

编辑:

这是我的错误的开始(完整错误包含 +4500 行,如果有必要我可以添加带有完整错误的 .txt)

/usr/local/lib/libopencv_core.a(system.cpp.o): In function `cv::ipp::getIPPSingleton()':
system.cpp:(.text._ZN2cv3ippL15getIPPSingletonEv+0xdb): undefined reference to `ippicvGetCpuFeatures'
system.cpp:(.text._ZN2cv3ippL15getIPPSingletonEv+0x16e): undefined reference to `ippicvSetCpuFeatures'
system.cpp:(.text._ZN2cv3ippL15getIPPSingletonEv+0x173): undefined reference to `ippicvGetEnabledCpuFeatures'
system.cpp:(.text._ZN2cv3ippL15getIPPSingletonEv+0x1ba): undefined reference to `ippicviGetLibVersion'
system.cpp:(.text._ZN2cv3ippL15getIPPSingletonEv+0x263): undefined reference to `pthread_mutexattr_init'
system.cpp:(.text._ZN2cv3ippL15getIPPSingletonEv+0x270): undefined reference to `pthread_mutexattr_settype'
system.cpp:(.text._ZN2cv3ippL15getIPPSingletonEv+0x283): undefined reference to `pthread_mutexattr_destroy'
system.cpp:(.text._ZN2cv3ippL15getIPPSingletonEv+0x2a1): undefined reference to `ippicvInit'
/usr/local/lib/libopencv_core.a(system.cpp.o): In function `cv::getInitializationMutex()':
system.cpp:(.text._ZN2cv22getInitializationMutexEv+0x63): undefined reference to `pthread_mutexattr_init'
system.cpp:(.text._ZN2cv22getInitializationMutexEv+0x70): undefined reference to `pthread_mutexattr_settype'
system.cpp:(.text._ZN2cv22getInitializationMutexEv+0x83): undefined reference to `pthread_mutexattr_destroy'

【问题讨论】:

【参考方案1】:

我会在 bash 中运行 pkg-config --libs --cflags opencv4 并检查链接器参数是否正确,以及路径/库是否存在。 make install 应该告诉你库被复制到哪里(/usr/local/lib 或类似的东西)。如果#include 有效,则包含目录通常设置正确。

【讨论】:

pkg-config --libs --cflags opencv4 给出了这个答案:-I/usr/local/include/opencv -I/usr/local/include -L/usr/local/lib -lopencv_cudabgsegm -lopencv_cudaobjdetect ...(然后是许多其他 lopencv_)似乎一切都链接得很好我修改了我的问题并添加了部分错误,因为这是我唯一的线索 您还会收到 pthread 链接器错误,这通常意味着未安装 pthread,但是您应该无法构建 opencv?编译器标志看起来不错,至少是你写的。我也不确定opencv如何处理ippi的东西/它来自哪里。你也可以尝试在构建opencv时禁用一些参数(-D WITH_CUDA=ON -D WITH_TBB=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1【参考方案2】:

遇到同样的问题。制作后就解决了

sudo ldconfig

从我触发安装的同一文件夹中。

试一试,好看。

【讨论】:

【参考方案3】:

最后我找到了解决办法,这个标志是有罪的:-D BUILD_SHARED_LIBS=OFF,删除后一切正常

【讨论】:

【参考方案4】:

虽然切换到动态链接可能已经解决了这个问题,但您通常必须针对静态构建中缺少的库进行链接。

在这种情况下,您必须根据您的错误消息至少链接pthreadlibippicv

【讨论】:

【参考方案5】:

静态链接需要包含更多的依赖项

你的代码

#include "opencv2/highgui.hpp"
#include <opencv2/imgproc.hpp>
#include <iostream> 

using namespace cv; 
using namespace std; 

int main() 
 
    cout << "V: " << CV_VERSION << endl;
    Mat frame;
    return 0; 

使用批处理脚本在我的系统上构建(win 8.1 64bit,opencv 4.2.0。使用 BUILD_SHARED_LIBS=OFF 编译,编译器 mingw-w64)

set gcc="C:\Program Files (x86)\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin\g++.exe"
set path_opencv=C:\opencv-4.2.0-vc14_vc15\opencv\build
%gcc% code.cpp -I"%path_opencv%\include" -L"%path_opencv%\x64\mingw-w64\lib" -lopencv_core420 -lz -lpthread

正如在 opencv 回答平台 after turning BUILD_SHARED_LIBS to OFF , there are too many undefined references 上讨论的那样,静态链接不会转发依赖项。因此我们需要额外链接库-lz -lpthread

此外,-l... 标志的顺序很重要。这意味着开放的依赖关系由以下库收集和满足。阅读Specify the libraries for the linker to use了解更多信息。

更正您的代码

包含#include &lt;opencv2/core/core.hpp&gt; 而不是highguiimgproc 就足够了。这是因为 cv::Mat 在core 中定义。出于这个原因,标志-lopencv_core420 就足够了,不需要-lopencv_highgui -lopencv_imgproc

【讨论】:

以上是关于链接 OpenCV 4.1.0,包括工作,库不的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 OpenCV libjpeg 和 fltkjpeg 之间的库冲突?

opencv 3.0 Visual Studio Community 2017 编译链接错误

如何在 Windows 上将 OpenCV 库正确链接到 Eclipse?

OpenCV4.1配置VS2017步骤

Qt Creator 链接器错误:LNK1104:无法打开文件“opencv_core249d.lib”

CMake RelWithDebInfo 链接到调试库