opencv 链接问题记录

223 阅读3分钟

起始缘由

ft2->getTextSize; imageparse中渲染文字的时候使用freetype2 服务端自带的OpenCV版本是3.2, opencv的各个lib都在/usr/lib/x86_64-linux-gnu/ 中 但是3.2版本的freetype2 没有 getTextSize 函数,因此之前准备使用OpenCV4, 之前在 /root/opencv-4.7.0 从源码编译链接库,lib安装在 /usr/local/lib 中 然后改了opencv.pc(/usr/lib/x86_64-linux-gnu/pkgconfig/opencv.pc), 想将OpenCV升级到4.7版本: 但是升级后链接报错,基本的Mat函数都报无法找到

报错一大堆,节摘部分如下:

/usr/bin/ld: ../comm/cvutil.o:cvutil.cpp:(.text+0x2498): more undefined references to `cv::Mat::Mat()' follow
cvutil.cpp:(.text+0x26e5): undefined reference to `cv::_InputArray::_InputArray(cv::MatExpr const&)'
/usr/bin/ld: cvutil.cpp:(.text+0x2832): undefined reference to `cv::_InputArray::_InputArray(cv::MatExpr const&)'
/usr/bin/ld: cvutil.cpp:(.text+0x2984): undefined reference to `cv::_InputArray::_InputArray(cv::MatExpr const&)'
/usr/bin/ld: ../comm/cvutil.o: in function `savePngFile(cv::Mat, cv::Mat, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
cvutil.cpp:(.text+0x2dd1): undefined reference to `cv::Mat::Mat()'
/usr/bin/ld: cvutil.cpp:(.text+0x2e3e): undefined reference to `cv::imwrite(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cv::_InputArray const&, std::vector<int, std::allocator<int> > const&)'
undefined reference to `cv::Mat::Mat()'

最终的解决方案是回滚 opencv.pc 文件,还好之前修改opencv.pc文件的时候留了备份,回滚后编译正常。 报错的opencv4的配置文件保存在 /usr/lib/x86_64-linux-gnu/pkgconfig/opencv-4-error-bake.pc 为什么会想到要回滚opencv.pc文件,编辑了一个最简单的cpp文件:

#include <opencv2/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char** argv){
    Mat image;
    Mat grayImage;
    if(!argv[1]){
        std::cerr << "No image data!" << std::endl;
        return -1;
    }
    image = imread(argv[1], 1);
    cvtColor(image, grayImage, COLOR_BGR2GRAY);
    imwrite("Gray_Image.jpg", grayImage);
    return 0;
}

在服务端编译链接的时报错:

g++ -o test_cv_build test_cv_build.cpp `pkg-config opencv --cflags --libs`
/usr/bin/ld: warning: libopencv_core.so.3.2, needed by /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/libopencv_hdf.so, may conflict with libopencv_core.so.407

因此想到版本问题,先回滚了OpenCV的版本。回滚后,编译imageparse继续报错,回滚到3.2版本的OpenCV后ft2->getTextSize还是支持不了。后续需要完整升级到4.7版本以彻底解决问题

g++ -c `pkg-config --cflags opencv` '-I../comm/' '-I..' '-std=c++11' '-O3' '-D RELEASE_BUILD=1' main.cpp -o main.o
g++ -c `pkg-config --cflags opencv` '-I../comm/' '-I..' '-std=c++11' '-O3' '-D RELEASE_BUILD=1' ImageProcess.cpp -o ImageProcess.o
g++ -c `pkg-config --cflags opencv` '-I../comm/' '-I..' '-std=c++11' '-O3' '-D RELEASE_BUILD=1' Text2Image.cpp -o Text2Image.o
Text2Image.cpp:85:6: error: no declaration matches ‘void IPTextRenderImpl::loadFontData(cv::String, int)’
 void IPTextRenderImpl::loadFontData(String fontFile, int faceIdx){
      ^~~~~~~~~~~~~~~~
Text2Image.cpp:19:10: note: candidate is: ‘void IPTextRenderImpl::loadFontData(std::__cxx11::string, int)’
     void loadFontData(string fontFile, int faceIdx);
          ^~~~~~~~~~~~
Text2Image.cpp:15:7: note: ‘class IPTextRenderImpldefined here
 class IPTextRenderImpl : public IPTextRender{
       ^~~~~~~~~~~~~~~~
Text2Image.cpp: In member functionvirtual cv::Mat IPTextRenderImpl::drawTextOnTrasparentBg(std::__cxx11::string, cv::Scalar, int, int, int’:
Text2Image.cpp:223:26: error: ‘class cv::freetype::FreeType2’ has no member named ‘getTextSize’
     Size textSize = ft2->getTextSize(text, fontHeight, thickness, &baseline);
                          ^~~~~~~~~~~
Text2Image.cpp: In member function ‘virtual cv::Mat IPTextRenderImpl::drawTextImg(std::__cxx11::string, cv::Scalar, cv::Scalar, int, int, int)’:
Text2Image.cpp:245:26: error: ‘class cv::freetype::FreeType2’ has no member named ‘getTextSize’
     Size textSize = ft2->getTextSize(text, fontHeight, thickness, &baseline);
                          ^~~~~~~~~~~
Text2Image.cpp: In member function ‘virtual cv::Size IPTextRenderImpl::getTextSize(const cv::String&, int, int, int*)’:
Text2Image.cpp:266:17: error: ‘class cv::freetype::FreeType2’ has no member named ‘getTextSize’
     return ft2->getTextSize(text, fontHeight, thickness, baseLine);
                 ^~~~~~~~~~~
Text2Image.cpp: In function ‘cv::Ptr<IPTextRender> createTextRender()’:
Text2Image.cpp:274:52: error: invalid new-expression of abstract class type ‘IPTextRenderImpl’
     return Ptr<IPTextRender> (new IPTextRenderImpl() );

现在除了imageparse工具因为ft2的问题编译失败之外,其他工具暂时没啥问题。

最终还是得彻底升级到4.7版本才行。