[英]Linking OpenCV 4.1.0, include works, libs doesn't
将 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
并获得工作可执行文件主要:
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'
我会在 bash 中运行pkg-config --libs --cflags opencv4
并检查链接器参数是否正确,以及路径/库是否存在。 make install
应该告诉你库被复制到哪里( /usr/local/lib
或类似的东西)。 如果#include
有效,则通常正确设置包含目录。
遇到了同样的问题。 制作后即可解决
sudo ldconfig
来自我触发安装的同一个文件夹。
试试看,好看。
最后我找到了一个解决方案,这个标志是有罪的: -D BUILD_SHARED_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;
}
使用批处理脚本在我的系统上构建(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
正如在将 BUILD_SHARED_LIBS 设置为 OFF 后在 opencv 答案平台上所讨论的那样,有太多未定义的引用静态链接不会转发依赖项。 因此,我们需要额外链接库-lz -lpthread
。
此外, -l... 标志的顺序很重要。 这意味着以下库收集并满足开放依赖项。 阅读指定链接器使用的库以获取更多信息。
包含#include <opencv2/core/core.hpp>
而不是highgui
和imgproc
。 这是因为 cv::Mat 在core
定义。 因此,标志-lopencv_core420
就足够了, -lopencv_highgui -lopencv_imgproc
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.