Linux安装OpenCV (C++) 并配置vscode

郁闷死了。。昨天重装Ubuntu,重写了一份巨详细的Opencv安装说明,结果网页上打开了两个编辑界面,我在一个界面保存了草稿但是没有发布,退出浏览器的时候另一个界面问我是否保存更改,点了确定结果把我之前写的所有东西全部覆盖掉了。。。在线编辑没有版本管理也太不靠谱了。。。

以上为吐槽,以下为重写以后的正文:
本文档的作用在于

  • opencv-4.5.5基于Ubuntu20.04的安装方法
  • vscode 对于opencv的路径配置
  • 一些安装过程中常见错误的解决方案

按照官方说明安装opencv(core modules)

系统环境:Ubuntu 20.04 LTS
opencv版本:opencv-4.5.5

opencv官方链接:https://docs.opencv.org/4.x/d7/d9f/tutorial_linux_install.html

工具准备

  • opencv包(如果不准备的话也可以,可以直接下载)
  • g++
  • cmake
  • wget (非必选)
  • unzip (非必选)
  • libgtk2.0-dev(官方没有提,但是不安装的话运行程序会报错)
  • pkg-config (官方没有提但是一定要安装)
  • 其他一系列工具
  1. 安装以上全部工具的LINUX命令如下所示:
sudo apt update && sudo apt install -y cmake g++ wget unzip
sudo apt install pkg-config libgtk2.0-dev
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev canberra-gtk-module
  1. 从github下载opencv包,并原地解压(如果使用自己下载的opencv包的话可以省略这一步,但记得解压)
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.x.zip
unzip opencv.zip
  1. 首先进入你的opencv加压出来的文件夹内,新建build文件夹,并进入其中。(官方这个是在opencv包的同级目录下新建build文件夹,我自己更喜欢把build文件放在opencv内部)
mkdir build
cd build
  1. 开始cmake
cmake  ..

cmake过程中的问题说明
在cmake过程中,可能需要从github上下载额外的资源,这时候比较容易出现的一个问题是有一个叫作“ippicv”的包需要远程下载,但是由于网络的问题,很容易就下载失败。这时候我们可以选择在电脑上手动下载,然后采取本地安装的方式安装这个包。具体操作步骤见本文末。

  1. make并设置多线程(-j4就是4线程同时进行的意思,这样可以加快处理速度)
make -j4

make编译完成后,如果成功的话,我们可以在build/lib路径下看到库文件,在build/bin路径下看到一些可执行的文件(样例,测试,apps等),运行以下指令可以查看上述文件是否存在。

ls bin
ls lib

另外,我们也可以在build目录下看到CMake package files,运行以下指令可查看。

ls OpenCVConfig*.cmake
ls OpenCVModules.cmake
  1. 如果上述检查都没问题的话,进行install,install的指令如下
sudo make install

按照默认设置,opencv会被安装到 /usr/local 目录下,所有的文件会被复制到以下位置:

/usr/local/bin - executable files
/usr/local/lib - libraries (.so)
/usr/local/cmake/opencv4 - cmake package
/usr/local/include/opencv4 - headers
/usr/local/share/opencv4 - other files (e.g. trained cascades in XML format)

opencv官方说明:安装过程只将文件复制到预定义的位置,并进行少量的修补。使用这种方法进行安装不会将opencv集成到系统包注册表中,因此,例如,opencv不能自动卸载。由于可能与系统包冲突,我们不建议普通用户进行全系统安装。

验证安装是否成功

安装完成后,我们有必要检验安装是否成功,我一般使用编译opencv自带的samples来检查。步骤如下:

  1. 回到最开始opencv加压出来的那个文件夹内,我们可以看到一个叫做samples文件夹。这个文件夹里面存储了opencv提供的示例文件。执行以下指令进入该文件夹,并在其中创建build目录,然后进入build目录。
cd samples
mkdir build
cd build
  1. 在build目录中依次执行cmake和make指令:
cmake ..
make -j4
  1. 编译完成后,我们可以发现在build目录内多出了一些文件夹,其中cpp文件夹存放的是c++文件编译出来的样例,进入cpp文件夹,我们来运行一个最基本的example_cpp_example示例,输入:
./example_cpp_example

正常情况下,终端只会提示一个no camera的warning,然后会跳出一个窗口,输出“Hello OpenCV”.
在这里插入图片描述

配置vscode

虽然在Linux内成功安装了opencv,但是我们仍然可能发现在vscode里,与opencv相关的模块导入被vscode用红色波浪线标记出来。这是因为vscode不知道从哪里去搜索opencv相关文件。

这时候我们可以在Linux中运行以下指令,搜索opencv相关文件:

sudo find / -iname "*opencv*"

然后我们会得到一堆搜索结果,比如下图这样的:
在这里插入图片描述接着,我们需要在vscode中同时按下Ctrl + Shift + P, 打开命令面板,在命令面板中输入 编辑配置,然后选择C/C++: 编辑配置(UI),如下图所示。
在这里插入图片描述接下来我们会来到Mircrosoft C/C++ 扩展的配置界面(打不开或者搜不到这个命令的话,原因是没有安装C/C++扩展,请在vscode中自行安装)。
在这里插入图片描述界面往下拉,我们会看到包含路径的配置选项,在下面空白中填入刚才查询到的opencv的路径即可。

这里需要说明的是:刚才查询的语句会让我们搜到很多具体文件的路径,但是实际需要填入编辑器路径的其实是目录,所以我们只需要把主要的文件夹填进去就好,比如像我这样只填写到 share/**, lib/**, include/**, bin/**这些路径就可以(后面的**号代表递归搜索),具体如下图所示。

在这里插入图片描述完成路径配置后,回到代码界面,我们会发面报错提示消失,选择头文件可以进行跳转。
在这里插入图片描述

一些错误和解决方案

1. terminate called after throwing an instance of ‘\cv::Exception’

详细报错如下:

./example_tutorial_Smoothing
terminate called after throwing an instance of '\cv::Exception'
  what():  OpenCV(4.5.5-dev) /home/liyao/opencv-4.x/modules/highgui/src/window.cpp:1250: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvNamedWindow'

Aborted (core dumped)

解决方案:按照提示安装libgtk2.0-dev 和 pkg-config,然后重新cmake和make opencv。

2. Package ‘opencv4’, required by ‘world’, not found

Package opencv4 was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv4.pc'
to the PKG_CONFIG_PATH environment variable
Package 'opencv4', required by 'world', not found
test.cpp:2:9: fatal error: opencv2/opencv.hpp: No such file or directory
 #include<opencv2/opencv.hpp>
         ^~~~~~~~~~~~~~~~~~~~
compilation terminated.

原因是没有将opencv添加到系统路径,解决方案如下第3点所示:

3. 将opencv添加到系统路径

prefix=/usr/local
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib

Name: opencv
Description: The opencv library
Version:4.5.5
Cflags: -I${includedir}/opencv4
Libs: -L${libdir} -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann  -lopencv_core

其中version是你的opencv版本。

4. 手动安装ippicv包

参考:https://www.jianshu.com/p/3c2fc0da7398/

  1. 打开opencv解压目录下的opencv-x.x.x\3rdparty\ippicv\ippicv.cmake文件。
  2. 翻到最底部,我们可以看到以下这么一段代码:
 "${OPENCV_IPPICV_URL}"
                 "$ENV{OPENCV_IPPICV_URL}"
                 "https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/"

这段代码标明了ippicv文件的远程下载路径,但是其中${IPPICV_COMMIT}是一个变量,只有知道了这个变量是什么,我们才能拼凑出完整的地址。

  1. 我们继续向上翻,可以找到以下两段代码:
# Commit SHA in the opencv_3rdparty repo
  set(IPPICV_COMMIT "a56b6ac6f030c312b2dce17430eef13aed9af274")

上面这行的代码就是IPPICV_COMMIT的值。

    if(X86_64)
      set(OPENCV_ICV_NAME "ippicv_2020_lnx_intel64_20191018_general.tgz")
      set(OPENCV_ICV_HASH "7421de0095c7a39162ae13a6098782f9")

上面这行代码是根据我们的系统来决定的,ippicv最终下载哪个版本。
由于我是Ubuntu 20.04, 所以选择的是X86_64下的文件名:ippicv_2020_lnx_intel64_20191018_general.tgz,其中lnx表示Linux。

  1. 把上面三段拼接在一起,就可以获得最终的下载地址。
    https://raw.githubusercontent.com/opencv/opencv_3rdparty/a56b6ac6f030c312b2dce17430eef13aed9af274/ippicv/ippicv_2020_lnx_intel64_20191018_general.tgz
  2. 从这个地址下载好ippicv包以后,将这个包拷贝到Linux系统中,我把它放在了和opencv压缩包同级的目录下。不需要解压,我们只需要在刚才的ippicv.cmake文件中将下载目录改为本地就可以:
  set(THE_ROOT "${OpenCV_BINARY_DIR}/3rdparty/ippicv")
  ocv_download(FILENAME ${OPENCV_ICV_NAME}
               HASH ${OPENCV_ICV_HASH}
               URL
                 "${OPENCV_IPPICV_URL}"
                 "$ENV{OPENCV_IPPICV_URL}"
                 "file:///home/你的用户名/ippicv存放的文件夹/"
               DESTINATION_DIR "${THE_ROOT}"
               ID IPPICV
               STATUS res
               UNPACK RELATIVE_URL)
  1. 然后我们继续原本的opencv安装流程,重新cmake一下,程序会自动根据上述我们设置的目录去找到ippicv的安装包,然后安装它。
<think>好的,我现在需要帮助用户解决Keil 5中出现的函数隐式声明错误。用户提到了C99标准不允许隐式函数声明,所以首先要理解这个错误的原因。根据引用[^1],C语言中每个函数在被调用前必须显式声明。这意味着如果用户在使用函数之前没有声明或定义它,编译器就会报错。 接下来,我得考虑用户的具体环境是Keil 5,这通常是用于嵌入式开发,特别是ARM微控制器。这种情况下,用户可能在使用C语言进行固件开发,或者涉及到一些特定的头文件或库。常见的隐式声明错误可能出现在没有包含必要的头文件,或者函数定义的位置在调用之后而没有前置声明。 首先,我应该检查头文件是否包含正确。例如,如果用户自己编写了一个函数,但是没有在调用它的源文件中包含对应的头文件,或者头文件中的函数声明有误,就会导致这个问题。需要提醒用户检查是否所有自定义函数都有对应的头文件声明,且在源文件中正确包含这些头文件。 其次,函数定义的位置也很重要。如果函数在调用之后才定义,而之前没有声明,编译器就无法识别。这时候需要在调用之前添加函数原型声明。比如,在文件开头添加`void myFunction(void);`这样的声明。 另外,标准库函数的使用也可能导致这个问题。比如,如果用户使用了`printf`但没有包含`stdio.h`,或者类似的库函数,编译器同样会报隐式声明错误。需要确保所有使用的库函数都有正确的头文件包含。 还有可能需要检查编译器选项是否符合C99标准。Keil默认可能使用较旧的C标准,用户需要确认项目设置中的C标准是否为C99或更高,因为隐式声明在C99中被禁止。如果设置不正确,编译器可能允许隐式声明,但用户的问题可能正相反,所以需要明确确认设置。 此外,拼写错误或函数名不一致也是常见问题。比如,函数定义时的名称和调用时的名称不一致,或者大小写错误,这会导致编译器找不到声明,从而报错。需要仔细检查函数名的拼写是否正确。 还有,如果用户使用了第三方库,可能需要检查库文件的路径是否正确,是否被正确包含到项目中。有时候,即使头文件存在,如果路径没有添加到项目的包含目录中,编译器也会找不到声明。 最后,可能需要检查代码中是否存在条件编译的问题,导致某些情况下的函数声明被跳过。例如,某些宏定义没有正确配置,导致头文件中的函数声明未被包含。 总结解决步骤应该是: 1. 包含正确的头文件。 2. 添加前置函数声明。 3. 检查标准库的包含。 4. 确认编译器设置为C99或更高。 5. 检查拼写和名称一致性。 6. 验证第三方库的配置。 用户可能遇到的问题示例包括:自定义函数未声明、忘记包含头文件、函数名拼写错误等。需要针对这些情况逐一排查。</think>### Keil 5隐式函数声明错误解决方案 #### 错误原因分析 在C99及以上标准中,函数必须显式声明后才能调用[^1]。Keil 5默认可能使用C99标准,若代码中存在未声明或未包含头文件的函数调用,会触发以下错误: ``` implicit declaration of function 'xxx' is invalid in C99 ``` #### 分步解决方案 1. **添加函数声明** - 在调用函数前添加显式声明(若函数定义在其他文件): ```c // 在文件顶部声明函数原型 void my_function(int param); ``` - 若函数定义在调用位置之后,需在调用前声明: ```c void my_function(int param); // 前置声明 int main() { my_function(10); } void my_function(int param) { /* 实现 */ } ``` 2. **包含头文件** - 若函数来自自定义头文件,确保包含路径正确: ```c #include "my_header.h" // 自定义头文件 ``` - 标准库函数需检查头文件是否遗漏,例如: ```c #include <stdio.h> // 使用printf时必须包含 #include <math.h> // 使用sqrt时必须包含 ``` 3. **验证编译器设置** - 在Keil中检查C语言标准配置: 1. 右键项目 -> Options for Target -> C/C++ -> Language/Code Generation 2. 确认"C99 Mode"已启用 ![Keil C99设置示例](https://example.com/keil_c99_setting.png) 4. **检查函数名一致性** - 排查函数定义与调用的名称差异: ```c // 错误示例:定义时名称拼写错误 void my_Funciton(void); // 声明 my_function(); // 调用时拼写不一致 ``` 5. **第三方库集成** - 若使用外部库(如STM32 HAL库),需确认: - 库文件已加入工程 - 头文件路径已配置: 1. 项目Options -> C/C++ -> Include Paths 2. 添加库头文件所在目录 #### 错误复现与修复示例 **问题代码**: ```c int main() { delay(100); // 触发隐式声明错误 } // 函数定义在调用之后且未声明 void delay(uint32_t ms) { // 实现 } ``` **修复代码**: ```c // 添加前置声明 void delay(uint32_t ms); int main() { delay(100); // 正确调用 } void delay(uint32_t ms) { // 实现 } ``` #### 扩展验证方法 1. **强制错误触发**(调试用): ```c #ifndef REQUIRED_HEADER_H #error "Missing header inclusion" // 类似引用[^2]的强制报错机制 #endif ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值