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 4.1.0,包括works、libs和x27;T_C++_Opencv_Ubuntu - Fatal编程技术网

C++ 链接OpenCV 4.1.0,包括works、libs和x27;T

C++ 链接OpenCV 4.1.0,包括works、libs和x27;T,c++,opencv,ubuntu,C++,Opencv,Ubuntu,将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_GE

将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; 
}
并获取可执行主文件:

V: 4.1.0-pre
但当我用垫子加了一行

#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; 
}

我会在bash中运行
pkg config--libs--cflags opencv4
,检查链接器参数是否正确,路径/库是否存在
makeinstall
应该告诉您lib复制到哪里(
/usr/local/lib
或类似的东西)。如果
#include
起作用,通常会正确设置include目录。

也遇到同样的问题。它解决后,使

sudo ldconfig

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


试一试,好好看看。

最后我找到了一个解决方案,这个标志是有罪的:
-D BUILD\u SHARED\u LIBS=OFF
,删除它后一切都很好

而切换到动态链接可能解决了这个问题,您通常必须在静态构建中链接缺少的库

在这种情况下,您必须根据错误消息至少针对
pthread
libippicv
进行链接。

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

#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; 
}
正如opencv answers平台上所讨论的,静态链接不会转发依赖项。因此,我们需要额外链接库
-lz-lpthread

此外,的顺序是-l。。。标志很重要。这意味着开放依赖项由以下库收集和满足。阅读更多信息

对代码的更正
包含
#包含
,而不是
highgui
imgproc
,就足够了。这是因为cv::Mat在
核心中定义。因此,标志
-lopencv\u core420
就足够了,不需要了
-lopencv\u highgui-lopencv\u imgproc

pkg config--libs--cflags opencv4
给出了这样的答案:
-I/usr/local/include/opencv-I/usr/local/include-L/usr/local/local/lib-lopencv\u cudabjggm-lopencv
。。。(然后是许多其他的lopencv_______________________________________________________?编译器标志看起来不错,至少是您编写的。我也不确定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
/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'
#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; 
}
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