ubuntu22.04安装opencv2.4.13

运行一个老板的软件,需要opencv2.4.1

作为初学的,好难。。。

记录一下问题,自己看,我也是小白呜呜呜,要骂我先来:误人子弟!!

错误1.

E: 无法定位软件包 libjasper1
E: 无法定位软件包 libjasper-dev

换了源还是不行 没有办法了 最后摆了 没有管

2. cmake

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_CUDA=OFF -DENABLE_PRECOMPILED_HEADERS=OFF ..

(1) CMAKE_BUILD_TYPE=Release:生成的可执行文件就带有调试信息,供gdb和gdbserver使用了。值可以为Release或者Debug。

(2) CMAKE_INSTALL_PREFIX=/usr/local :安装路径 要是装下个版本记得要改

(3) WITH_CUDA=0FF: 禁用cuda

(4) -DENABLE_PRECOMPILED_HEADERS=OFF:cuda_next 错误

3. make -j8

 make -j8

问题1:

/usr/local/gcc/gcc-6.3.0/include/c++/6.3.0/cstdlib:75:25: 致命错误:stdlib.h:没有那个文件或目录
 #include_next
                         ^
编译中断。

解决办法:编译加入 -DENABLE_PRECOMPILED_HEADERS=OFF (之前的camke已经加入)

出现新问题2:

/home/***/Downloads/opencv-2.4.13/modules/core/src/parallel.cpp:60:32: 致命错误:sys/sysctl.h:没有那个文件或目录
         #include

解决办法:

android - PHash fatal error: 'sys/sysctl.h' file not found - Stack Overflow

我先

locate sysctl.h

发现确实sys下没有,而linux下有,接下来就是把所有sys/sysctl.h,改成linux/sysctl.h,直到不再报错

ubuntu22.04安装opencv2.4.13_第1张图片

之后又有错误3:

错误:‘AVFMT_RAWPICTURE’在此作用域中尚未声明

错误:‘CODEC_FLAG_GLOBAL_HEADER’在此作用域中尚未声明

方法:

忘了是哪篇博客了,用了别的大佬的办法:

在 opencv/modules/videoio/src/cap_ffmpeg_impl.hpp 顶端添加

    #define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
    #define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
    #define AVFMT_RAWPICTURE 0x0020

错误4:

undefined reference to `std::random_device::_M_getentropy() const@GLIBCXX_3.4.25'

/usr/bin/ld: /lib/x86_64-linux-gnu/libopenmpt.so.0: undefined reference to `std::to_chars(char*, char*, double)@GLIBCXX_3.4.29'
/usr/bin/ld: /lib/x86_64-linux-gnu/libopenmpt.so.0: undefined reference to `std::__throw_bad_array_new_length()@GLIBCXX_3.4.29'

解决:

尝试1(错误):没找到解决方法,最后把gcc升级到9.1.0,问题还是没有解决,唉...

尝试2:(没尝试完,装了一天vtk没装上)

看到一个回答:安装

vtk 
hdf5   (建议安装高版本的,我在安装低版本的时候会有各种各样的错误,成功安装了1.13.2

        (Ubuntu 安装 HDF5 C++库_大作家佚名的博客-CSDN博客
glew(Ubuntu下glfw的安装与使用_parry_liu的博客-CSDN博客)

尝试3(正确):换了gcc-11

换gcc版本(前提是已经装好了):

查看已经有的gcc:

ls -l /usr/bin/gcc*

设置软连接(设置过的跳过):前面的目录是查到的gcc路径,最后的数字是自己写的版本号

sudo ln -s /usr/local/gcc/gcc-9.1.0/bin/gcc /usr/bin/gcc-9

添加到系统管理器中:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 40

切换 gcc 版本:按照提示输入数字选择版本  以后直接换就行

sudo update-alternatives --config gcc

同理换g++

sudo ln -s /usr/local/gcc/gcc-9.1.0/bin/g++ /usr/bin/g++-9
sudo update-alternatives  --install /usr/bin/g++ g++ /usr/bin/g++-9 40

切换g++版本:

sudo update-alternatives --config g++

最后查看一下版本,检查一下:

gcc --version
g++ --version

成功了。。。

3. make install

没有报错

总结:早知道就直接用gcc11le ,主要是老师的那个东西不能用gcc11编译,早早地换了低版本,换早了

你可能感兴趣的:(linux,运维,服务器)