当前位置:   article > 正文

Ubuntu18.04平台下C/C++编程环境搭建及OpenCV4.5.4安装_ubuntu opencv c++

ubuntu opencv c++

安装Vim编辑器

Vi 编辑器是 Linux 和 Unix 上最基本的文本编辑器,工作在字符模式下,支持众多的命令,是一款功能强大,效率很高的文本编辑器。Vi 编辑器可以对文本进行编辑、删除、查找和替换、文本块操作等,全部操作都是在命令模式下进行的。Vi 有两种工作模式:命令模式输入模式

在终端输入如下命令,可安装vim

sudo apt-get install vim 
  • 1

查看vim版本

vim --version
  • 1

启动vim

vi
  • 1

在命令模式下输入如下所示的命令都可以退出 Vi 编辑器,回到 Shell 界面

命令说明
:q退出未被编辑过的文件
:q!强行退出vi,丢弃所有改动
:wq存盘退出vi

Vi 编辑器的整个文本编辑都用键盘而非鼠标来完成,传统的光标移动方式是在命令模式下输入 h、j、k、l 完成光标的移动,后来也支持键盘的方向键以及 Page Up 和 Page Down 翻页键

直接用vi创建文件

vi hello.c
  • 1

安装GCC

GCC(GNU Compiler Collection,GNU 编译器套件),是由 GNU 开发的编程语言编译 器。GNU 编译器套件包括 C、C++、Objective-C、Fortran、Java、Ada 和 Go 语言的前端, 也包括了这些语言的库(如 libstdc++、libgcj 等)。GCC 的官网是 http://gcc.gnu.org,目前最 新版本是 GCC 12.2。 GCC 支持多种计算机体系结构芯片,如 X86、ARM、MIPS 等,并已被移植到其它多 种硬件平台。

gcc是一个编译器套件,包含很多软件包

名称功能
gccC编译器
g++C++编译器
libstdc++标准C++库

用于编译和链接 C/C++ 程序所需的文件扩展名如下所示

扩展名文件内容
.cC语言源码
.C.cc.cxxC++语言源码
.hC/C++源代码头文件
.i.c文件经过预处理后得到的C语言源代码
.ii.C.cc.cxx文件经过预处理后得到的C++源代码
.o目标文件,编译过程得到的中间文件
.s汇编语言文件,是.i文件编译后得到的中间文件
.so动态链接库

在终端输入如下命令,可安装build-essential

sudo apt-get install build-essential 
  • 1

查看gcc版本,我的版本为7.5.0

gcc -v
  • 1

查看linux内核版本,我的版本为5.4.0-125-generic

uname -r
  • 1

查看ubuntu版本

cat /etc/issue
  • 1

返回结果

Ubuntu 18.04.6 LTS \n \l
  • 1

查看已安装gcc版本

ls /usr/bin/gcc*
  • 1

gcc/g++编译过程

  1. 预处理:包含头文件,宏定义扩展,条件编译的选择
gcc -E test.c –o test.i
  • 1
g++ -E test.cpp –o test.i
  • 1
  1. 编译:将预处理得到的源代码文件,翻译成汇编文件
gcc -S test.i -o test.s
  • 1
g++ -S test.i -o test.s
  • 1
  1. 汇编:将汇编语言翻译成机器码
gcc -c test.s -o test.o
  • 1
g++ -c test.s -o test.o
  • 1
  1. 链接
gcc test.o -o test
  • 1
g++ test.o -o test
  • 1

gcc/g++重要编译参数

  1. -g → \to 编译带调试信息的可执行文件
  2. -O(n) → \to 优化源代码
  3. -l指定库文件-L指定库文件路径
  4. -I指定头文件搜索目录
  5. -Wall打印警告信息
  6. g++关闭警告信息
  7. -std=c++11设置编译标准
  8. -o指定文件输出名
  9. -D定义宏

g++命令行编译示例

最初目录结构

swap
├── include
│   		└── swap.h
├── main.cpp
└── src
       		└── swap.cpp
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

直接编译,运行

g++ main.cpp src/swap.cpp -Iinclude
./a.out
  • 1
  • 2

增加参数编译,并运行

g++ main.cpp src/swap.cpp -Iinclude -std=c++11 -O2 -Wall -o b.out
./b.out
  • 1
  • 2

生成库文件并编译

  1. 链接静态库生成可执行文件
//进入src目录
cd src

//汇编,生成.o文件
g++ swap.cpp -c -I../include
//生成静态库.o文件
ar rs libswap.a swap.o
//回到上级目录
cd ..
//链接
g++ main.cpp -Iinclude -Lsrc -lswap -o staticmain
//运行
./staticmain
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
swap
├── a.out
├── b.out
├── include
│   └── swap.h
├── main.cpp
├── src
│   ├── libswap.a
│   ├── swap.cpp
│   └── swap.o
└── staticmain

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  1. 链接动态库生成可执行文件
//进入src目录
cd src

//生成动态库libswap.so
g++ swap.cpp -I../include -fPIC -shared -o libswap.so
//回到上级目录
cd ..
//链接
g++ main.cpp -Iinclude -Lsrc -lswap -o sharemain
//运行
LD_LIBRARY_PATH=src ./sharemain
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
.
├── a.out
├── b.out
├── include
│   └── swap.h
├── main.cpp
├── sharemain
└── src
    ├── libswap.so
    └── swap.cpp

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

GDB调试器

GDB是一个用来调试C/C++程序的功能强大的调试器,是Linux系统开发C/C++最常用的调试器

调试开始:gdb [exefilename],进入gdb调试程序,其中exefilename为要调试的可执行文件名

help   		//查看命令帮助
run     	//重新开始运行文件
start  		//单步执行,运行程序,停在第一步执行程序
list      	//查看源代码
set      	//设置变量的值
next   		//单步调试(逐过程,函数直接执行)
step   		//单步调试,逐语句,跳入自定义函数内部执行
backtrace   //查看函数调用的栈帧和层级关系
finish      //结束当前函数
continue    //继续执行
print            	//打印值
quit             	//退出gdb
break+num         	//在num行设置断点
info breakpoints   	//查看当前设置的所有断点
delete breakpoints num   //删除第num个断点
display     		//追踪查看具体变量值
undisplay
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

Tips:

1.编译程序时需要加上-g,之后才能用gdb进行调试:gcc -g main.cpp -o main
2. 回车键:重复上一命令

命令行调试

先生成可执行文件

g++ -g sum.cpp -o a_yes_g
  • 1

然后开启gdb调试

gdb a_yes_g
  • 1

断点调试

break 13
  • 1

查看所有断点

info breakpoints
  • 1

简写

i b
  • 1

开始运行

run
  • 1

打印值

print i
  • 1

继续执行

continue
  • 1

追踪查看具体变量值

display i
  • 1

查看源代码

list
  • 1

退出gdb

quit
  • 1

VSCode安装

安装

sudo dpkg -i code_1.49.3-1601661857_amd64.deb
  • 1

插件安装

C/C++
CMake
CMake Tools
  • 1
  • 2
  • 3

快捷键

功能快捷键
转到文件Ctrl + p
关闭文件Ctrl + w
打开命令面板Ctrl + Shift + p
当前行上移/下移Alt + Up/Down
打开终端Ctrl + `
变量统一命名F2
关闭侧边栏Ctrl + B
转到定义处F12
代码格式化Ctrl + Shift +i
全屏F11
放大/缩小Ctrl + / -

配置json文件并调试项目

launch.json

"program": "${workspaceFolder}/build/cmake_exe"

"cwd": "${workspaceFolder}"

"preLaunchTask": "Build",
"miDebuggerPath": "/usr/bin/gdb"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

tasks.json

{   
    "version": "2.0.0",
    "options": {
        "cwd": "${workspaceFolder}/build"
    },
    "tasks": [
        {
            "type": "shell",
            "label": "cmake",
            "command": "cmake",
            "args": [
                ".."
            ]
        },
        {
            "label": "make",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "command": "make",
            "args": [

            ]
        },
        {
            "label": "Build",
			"dependsOrder": "sequence", // 按列出的顺序执行任务依赖项
            "dependsOn":[
                "cmake",
                "make"
            ]
        }
    ]

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

Git

安装

sudo apt-get install git
  • 1

设置签名

git config --global user.name sjn
git config --global user.email 邮箱地址
  • 1
  • 2

SSH

ssh-keygen -t rsa -C 邮箱地址
进入.ssh目录,复制id_rsa.pub文件内容
登录GitHub。Settings --> SSH and GPG keys --> New SSH Key
回到git通过ssh地址创建。git remote add 别名 SSH地址
  • 1
  • 2
  • 3
  • 4

CMake

CMake是一个跨平台的安装编译工具,可以用简单的语句描述所有平台的编译过程

基本语法格式:指令(参数1 参数2)

指令是大小写无关的,参数和变量是大小写相关的

变量使用${}方式取值,但是在IF语句中是直接使用变量名

重要指令

  • cmake_minimum_required - 指定CMake的最小版本要求

语法:cmake_minimum_required(VERSION versionNumber [FATAL_ERROR])

# CMake最小版本要求2.8.3
cmake_minimum_required(VERSION	2.8.3)
  • 1
  • 2
  • project - 定义工程名称,并可指定工程支持的语言

语法:project(projectname [CXX] [C] [Java])L

# 指定工程名为HELLOWORLD
project(HELLOWORLD)
  • 1
  • 2
  • set - 显式的定义变量
# 定义SRC变量,其值为main.cpp	hello.cpp
set(SRC sayhello.cpp	hello.cpp)
  • 1
  • 2
  • include_directories-向工程添加多个特定的头文件搜索路径 —> 相当于指定g++编译器的-I参数
# 将/usr/include/myincludefolder	和   ./include	添加到头文件搜索路径
include_directories(/usr/include/myincludefolder	./include)
  • 1
  • 2
  • link_directories-向工程添加多个特定的库文件搜索路径 —> 相当于指定g++编译器的-L参数
# 将/usr/lib/mylibfolder	和  ./lib	添加到库文件搜索路径
link_directories(/usr/lib/mylibfolder	./lib)
  • 1
  • 2
  • add_library-生成库文件
# 通过变量 SRC 生成 libhello.so共享库
add_library(hello	SHARED	$(SRC))
  • 1
  • 2
  • add_compile_options - 添加编译参数
# 添加编译参数
add_compile_options(-wall -std=c++11 -o2)
  • 1
  • 2
  • add_executable - 生成可执行文件
# 编译main.cpp生成可执行文件
add_executable(main	main.cpp)
  • 1
  • 2
  • target_link_libraries - 为target添加需要链接的共享库 —> 相当于指定g++编译器-l参数
# 将hello动态库链接到可执行文件main
target_link_libraries(main hello)
  • 1
  • 2
  • add_subdirectory - 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置
# 添加src子目录,src中需有一个CMakeLists.txt
add_subdirectory(src)
  • 1
  • 2
  • aux_source_directory - 发现一个目录下所有的源文件代码并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表
# 定义SRC变量,其值为当前目录下所有的源代码文件
aux_source_directory(.  SRC)
# 编译SRC变量所代表的源代码文件,生成main可执行文件
add_executable(main ${SRC})
  • 1
  • 2
  • 3
  • 4

CMake常用变量

  • CMAKE_C_FLAGS gcc编译选项
  • CMAKE_CXX_FLAGS g++编译选项
# 在CMAKE_CXX_FLAGS编译选项后追加-std=c++11
set(CMAKE_CXX_FLAGS  "${CAMKE_CXX_FLAGS} 	-std=c++11")
  • 1
  • 2
  • CMAKE_BUILD_TYPE 编译类型(Debug, Release)
# 设定编译类型为debug, 调试时需要选择debug
set(CMAKE_BUILD_TYPE	Debug)
# 设定编译类型为release, 发布时需要选择release
set(CMAKE_BUILD_TYPE	Release)
  • 1
  • 2
  • 3
  • 4
  • CMAKE_C_COMPILER: 指定C编译器
  • CMAKE_CXX_COMPILER:指定C++编译器
  • EXECUTABLE_OUTPUT_PATH:可执行文件输出的存放路径
  • LIBRARY_OUTPUT_PATH:库文件输出的存放路径

CMake编译工程

CMake目录结构:项目主目录存放一个CMakeLists.txt文件

两种方式设置编译规则:

  1. 包含源文件的子文件夹包含CMakeLists.txt文件,主目录的CMakeLists.txt通过add_subdirectory添加子目录即可
  2. 包含源文件的子文件夹未包含CMakeLists.txt文件,子目录编译规则体现在主目录的CMakeLists.txt中

编译流程: 在linux平台下使用CMake构建C/C++工程的流程如下

  • 手动编写CMakeLists.txt
  • 执行命令cmake PATH生成Makefile(PATH 是顶层CMakeLists.txt所在目录)
  • 执行命令make进行编译
#important tips
.                       #表示当前目录
. /                    #表示当前目录

. .                     #表示当前目录
. ./                   #表示当前目录
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

两种构建方式:

  • 内部构建:不推荐使用
    内部构建会在同级目录下产生一大堆中间文件,这些中间文件并不是最终所需要的,和工程源文件放在一起不合适
  • 外部构建:推荐使用
    将编译输出文件与源文件放到不同的目录中
## 外部构建

# 1. 在当前目录下,创建build文件夹
mkdir	build
# 2. 进入build文件夹
cd build
# 3. 编译上级目录的CMakeLists.txt,生成Makefile和其他文件
cmake	..
# 4. 执行make命令,生成target
make
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

安装OpenCV4.5.4

参考:https://docs.opencv.org/3.4.10/d7/d9f/tutorial_linux_install.html

安装CMake

sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
  • 1

查看CMake版本

cmake --version
  • 1

默认安装版本是3.10.2

OpenCV4.5.4下载

.zip文件下载后放在/home/jn中,并输入指令解压文件

unzip opencv-4.5.4
  • 1

opencv-4.5.4文件夹下创建build文件夹

mkdir build
  • 1

进入build文件夹

cd build
  • 1

build目录下执行 cmakemake

cmake -D WITH_TBB=ON -D WITH_EIGEN=ON -D OPENCV_GENERATE_PKGCONFIG=ON  -D BUILD_DOCS=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF  -D WITH_OPENCL=OFF -D WITH_CUDA=OFF -D BUILD_opencv_gpu=OFF -D BUILD_opencv_gpuarithm=OFF -D BUILD_opencv_gpubgsegm=O -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
  • 1

在终端输入

nproc
  • 1

可查看线程数,线程为4,因此数字为4

make -j4
  • 1
sudo make install
  • 1

环境配置

修改动态库
sudo gedit /etc/ld.so.conf.d/opencv.conf
  • 1
/usr/local/lib
  • 1
sudo ldconfig 
  • 1
更新 PKG_CONFIG_PATH
sudo gedit /etc/bash.bashrc
  • 1
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
  • 1
  • 2
source /etc/bash.bashrc
sudo updatedb
  • 1
  • 2
验证
pkg-config --modversion opencv4 #查看版本号
pkg-config --libs opencv4 #查看libs库
  • 1
  • 2

代码测试

创建test文件夹,创建test.cpp,创建CMakeLists.txt

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
	VideoCapture cap(0);
	Mat img;

	while (true) {

		cap.read(img);

		imshow("Image", img);
		waitKey(1);
	}

	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(test)
find_package(OpenCV REQUIRED)
add_executable(test01 test.cpp)
target_link_libraries(test01 ${OpenCV_LIBS})
  • 1
  • 2
  • 3
  • 4
  • 5
cmake .
  • 1
make
  • 1

遇到问题

Failed to load module "canberra-gtk-module"
  • 1
sudo apt-get install libcanberra-gtk-module
  • 1

参考文献:

  1. Ubuntu 安装 OpenCV 4.5.5
  2. Ubuntu18.04安装Opencv4.5(最新最详细)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/490918
推荐阅读
相关标签
  

闽ICP备14008679号