ubuntu入门---从配置虚拟机到使用qtcreator运行opencv3.4(C++)

文章目录

前言 一、使用VMware安装ubuntu16.04 二、LINUX基本指令 1.LINUX简单介绍 2.基本指令 三、配置GCC 1.GCC简介 2.安装GCC 3.安装并不同的GCC版本 4.GCC基本命令 四、配置qtcreator 1.为什么选择qtcreator 2.安装qtcreator 3.使用qtcreator配置C++运行环境 五、配置Opencv 1.下载opencv 2.安装opencv 3.测试 六、使用QTcreator运行opencv程序 碎碎念


前言

在日常的学习生活中,我们难免会碰到一些特定的需求,比如在ubuntu16.04中使用qtcreator运行Opencv程序之类。因此,在本片文章中,会一步一步教读者从配置虚拟机,安装ubuntu16.04系统,学习linux一些基础指令,安装GCC和qtcreator以及配置opencv的环境,同时拓展其中的部分知识点。
作为涵盖了较多内容的一篇教程,很难做到所有内容均为原创,一些地方会直接引用其他人的教程,或者直接给出链接。读者可以根据目录检索自己需要的内容。

一、使用VMware安装ubuntu16.04

因为前人的教程已经相当完善,这里直接贴出链接,根据自己下载的软件版本进行微调。
VMware虚拟机安装Ubuntu16-18系统超详细过程(含下载地址)

二、LINUX基本指令

1.LINUX简单介绍

Linux是指一种计算机操作系统:Linux也可指操作系统的内核,实际应用上人们已经习惯了用Linux来形容整个基于Linux内核,并且搭载了各种人机界面,应用和服务软件的操作系统。基于这些组件的Linux软件被称为Linux发行版。
而Ubuntu是Linux的一个分支发行套件,继承了LINUX系统的所有优点:开源、免费、自由、安全,并且具有出色的图形化界面,适合学习linux系统和开发linux应用程序。

2.基本指令

一、文件/文件夹管理

ls 列出当前目录文件(不包括隐含文件)
ls -a 列出当前目录文件(包括隐含文件)
ls -l 列出当前目录下文件的详细信息

cd … 回当前目录的上一级目录
cd - 回上一次所在的目录
cd ~ 或 cd 回当前用户的宿主目录
mkdir 目录名 创建一个目录
rmdir 空目录名 删除一个空目录
rm 文件名 文件名 删除一个文件或多个文件
rm -rf 非空目录名 删除一个非空目录下的一切

mv 路经/文件 /经/文件移动相对路经下的文件到绝对路经下
mv 文件名 新名称 在当前目录下改名
find 路经 -name “字符串” 查找路经所在范围内满足字符串匹配的文件和目录

二、系统管理

fdisk fdisk -l 查看系统分区信息
fdisk fdisk /dev/sdb 为一块新的SCSI硬盘进行分区
chown chown root /home 把/home的属主改成root用户
chgrp chgrp root /home 把/home的属组改成root组

Useradd 创建一个新的用户
Groupadd 组名 创建一个新的组
uname -a 查看内核版本
cat /etc/issue 查看ubuntu版本
lsusb 查看usb设备
sudo ethtool eth0 查看网卡状态
cat /proc/cpuinfo 查看cpu信息
lshw 查看当前硬件信息
sudo fdisk -l 查看磁盘信息
df -h 查看硬盘剩余空间
free -m 查看当前的内存使用情况
ps -A 查看当前有哪些进程
kill 进程号(就是ps -A中的第一列的数字)或者 killall 进程名( 杀死一个进程)
kill -9 进程号 强制杀死一个进程

reboot Init 6 重启LINUX系统
Halt Init 0 Shutdown –h now 关闭LINUX系统

三、打包/解压

tar -c 创建包 –x 释放包 -v 显示命令过程 –z 代表压缩包
tar –cvf benet.tar /home/benet 把/home/benet目录打包
tar –zcvf benet.tar.gz /mnt 把目录打包并压缩
tar –zxvf benet.tar.gz 压缩包的文件解压恢复
tar –jxvf benet.tar.bz2 解压缩

四、make编译

make 编译
make install 安装编译好的源码包

以上为linux系统命令的基本内容,更多的请上网了解

三、配置GCC

为了得到良好的安装体验,国内的读者建议在ubuntu上安装任何软件前先将软件的下载源切换为国内的清华源或者阿里源。

1.GCC简介

参考文章:浅显易懂的GCC使用教程——初级篇

GCC(GNU Compiler Collection)即GNU编译器套件,属于一种编程语言编译器,其原名为GCC(GNU C Compiler)即GNU c语言编译器,虽然缩写一样但是功能上区别很大。GCC的初衷是为GNU操作系统专门编写的一款编译器,原本的GNU是专用于编译C代码,现如今已扩展为可以编译C、C++、Java、Objective-C等多种编程语言的编译器集合了。这里主要介绍gcc或g++的使用。

gcc(GUN C Compiler)是GCC中的c编译器,而g++(GUN C++ Compiler)是GCC中的c++编译器。
gcc和g++两者都可以编译c和cpp文件,但存在差异。gcc在编译cpp时语法按照c来编译但默认不能链接到c++的库(gcc默认链接c库,g++默认链接c++库)。g++编译.c和.cpp文件都统一按cpp的语法规则来编译。所以一般编译c用gcc,编译c++用g++。

2.安装GCC

首先,这里使用的ubuntu16.04中是自带GCC的,可以使用gcc --version查看当前gcc的版本。
可以看到当前gcc的版本为5,.4.0
如果当前系统没有gcc的话,可以使用以下的方法安装:

默认的Ubuntu存储库包含一个名为build-essential的元包,它包含GCC编译器以及编译软件所需的许多库和其他实用程序。这意味着,安装了build-essential同时也就是安装gcc和g++编译器。

1.首先输入 sudo apt update更新包列表。
这里对这条指令作出简单的解析:
这句我们可以拆成三部分,sudo,apt,update
在ubuntu 系统下,sudo为“superuser do”的缩写,其主要功能就是提权,因为后方的apt update需要root权限也就是系统中最高的权限运行,apt会在普通用户无法操作的目录进行工作,所以需要大哥来干活(指root用户。
apt的全称为Advanced Package Tool,高级包工具。也可以说是是一个应用管理工具,类似于你电脑上安装的金山软件,腾讯应用中心,360软件中心这类。
区别就是,金山这类软件的软件列表是你进入软件中心的时候,实时从金山服务拉取列表。而apt是本地存了一份软件包信息的列表,比如软件大小,版本号,依赖等。
update 则是你要求apt干的活。这里你要求apt从源拉取最新的软件表来更新保存在本地的软件信息表,如果不更新,可能你安装的软件的时候安装成了老版本。

在这里插入图片描述
顺带一提,第一次使用sudo命令的时候他会要求你输入密码,此时你输入的密码是不可见的,直到按下回车,你才能直到自己输入的密码正确不正确。

2.键入以下命令安装build-essential软件包:

sudo apt install build-essential

install指令会安装指定的包,并同时安装其依赖的其他包。这里就是安装了build-essential包。
如果你的系统里没有这个包的话,该命令将安装一堆新包,包括gcc,g++和make。

这里简单提一下依赖关系。Linux的依赖关系因为他的整个系统都是由各个不同的开发组开发的软件集合而成,每个软件都有不同的功能提供和调用。因此linux系统在运行一个软件的时候,往往需要其他软件模块的协同才能成功运行。linux的灵活性就体现在其软件包是可以灵活组成的,你需要使用什么模块就有选择的安装什么模块。而windows系统通常会将所有依赖关系一股脑全给你装上,优点是不需要繁琐的依赖配置,缺点就是整个系统的臃肿和庞大。

在这里插入图片描述
这里因为已经是最新版了因此没有安装新的build-essential。

3.安装并不同的GCC版本

有时候我们并不需要apt自动给我安装的最新版本的gcc,此时我们就可以选择旧版本的gcc进行安装。
例如我们想要使用4.8版本的gcc和g++,可以键入如下指令

sudo apt-get install gcc-4.8 g++-4.8

在“您希望执行吗”处输入y,即可进行安装。
在这里插入图片描述
安装结束后,此时我们输入gcc --version 查看gcc的版本,发现还是最新的5.4
在这里插入图片描述
要如何切换到我们想要的版本呢?输入以下指令:

1.将某个版本加入gcc候选中
输入以下指令,将gcc4.8版本加入gcc候选中,最后的数字是优先级,我自己是直接设为100:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100

同样的我们也将原来系统中的gcc的优先级改成100,这样我们就能在选择完当前使用版本之后不会恢复默认优先级的版本。

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 100

update-alternatives是Debian系统中专门维护系统命令链接符的工具,通过它可以很方便的设置系统默认使用哪个命令、哪个软件版本。这个例子中的系统中同时安装了gcc5和gcc4.8,我们通过update-alternatives可以很方便地实现管理。
指令详情看这个网站update-alternatives详解

2.通过下面的指令来选择不同的gcc和g++的版本
输入

sudo update-alternatives --config gcc

可以看到gcc指令链接上了两个gcc的版本,当前默认为gcc-4.8。选择你要切换的版本
在这里插入图片描述
这里不进行切换,直接回车。
此时再输入gcc --version,发现版本已经切换到gcc4.8了
在这里插入图片描述
同样的道理,你可以自由切换gcc和g++指令链接的版本。

4.GCC基本命令

这里以生成一个C语言的可执行文件为例,并命名为hello.c存放在桌面。
源代码:

#include<stdio.h>

int main(){
 	printf("hello world");
	return 0;
}

以此在桌面文件夹下输入如下指令

	gcc -E hello.c -o hello.i   # 头文件展开,宏替换,注释去掉.
    gcc -S hello.i              # c文件变成汇编文件(生产hello.s).
    gcc -c hello.s              # 汇编文件变成二进制文件(生产hello.o).
    gcc hello.o -o hello        # 将函数库中相应的代码组合到目标文件中.

注:与windows不同的是,linux的可执行文件是没有.exe后缀的。或者说,linux的文件系统是没有后缀这个概念的,大多时候加上后缀只是方便程序进行区分。

以上为生成一个可执行文件的基本步骤。
除此以外,也可以输入gcc hello.c -o hello一步到位,直接生成可执行文件。

如果要运行可执行文件,只需要进入当前文件夹,输入./hello 即可运行。

GCC命令基础可参考以下链接或官方文档GCC命令基础

四、配置qtcreator

大多数时候,我们并不直接使用命令行对源文件进行编译,我们更希望借助IDE(集成开发环境)的辅助,以让我更高效的进行编程,这里向大家推荐一款跨平台的IDE:qtcreator。

1.为什么选择qtcreator

因为好用,跨平台,而且免费。

2.安装qtcreator

如果只是将其作为一个C/C++开发环境的话,简单粗暴的执行下面一条指令即可安装:

sudo apt install qtcreator

这条指令会自动安装安装qtcreator所需要的依赖文件
但如果要使用qt的的库的话,还需要输入以下指令安装qt5的库文件:

sudo apt install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools

安装完之后你就能在qtcreator上编写你想要的GUI应用程序了~

踩坑注意:

安装完后,输入qmake --version查看安装是否成功
在这里插入图片描述
很不幸,这里提示无法运行qmake,原因是在他所提供的路径上找不到qmake命令的执行文件。虽然现在你已经可以输入qtcreator命令运行qtcreator了,但直觉(惨痛的教训)告诉我们,这个问题不解决,以后可能会遇到令你痛苦一生的bug。

解决方法:
修改bashrc文件中的环境变量
1.输入gedit ~/.bashrc,用gedit文本编辑器打开bashrc文件
2.在bashrc文件的结尾加上export QT_SELECT=qt5,保存并关闭
3.输入source ~/.bashrc刷新修改过的初始化文件(重启操作系统也是同样的效果)
注:1.source 命令用于刷新初始化文件,使用户不必重启也能更新他的配置文件。
2.~/表示用户目录,可以将其简单的替换为/home/username/。
3.同windows系统一样,LINUX系统也有环境配置文件,那就是.bashrc文件。.bashrc文件主要保存个人的一些个性化设置,如命令别名、路径等。

还有另一种解决办法可以参考qmake: could not exec ‘/usr/lib/x86_64-linux-gnu/qt4/bin/qmake’: No such file or directory
qmake这条命令通常安装在/usr/lib/bin目录下,把第一行替换即可。
再次输入qmake -v ,我们的命令终于不迷路了。
在这里插入图片描述

3.使用qtcreator配置C++运行环境

理论上在配置完上述环境后,qtcreator是可以直接投入使用的,但有时候会遇上Kit配置出现问题的情况。这里提供一种配置kit的步骤,供有问题的读者参考。
首先点击:工具–>选项,之后弹出选项界面。
在这里插入图片描述
在选项界面找到 构建和运行中 的 编译器 可以在这里更改编译器路径。通常如果你gcc是配置好的话,qtcreator会自动检测到系统中的gcc(这里系统自动监测到了g++)文件路径并将其显示出来,将其选定,点击apply即可。
在这里插入图片描述
有时候需要手动设置编译器路径,点击右上角的添加,选择系统安装好的编译器,比如GCC
在这里插入图片描述
浏览目录,找到你要使用的编译器即可
在这里插入图片描述
最后在构建套件那边选择你使用的编译器即可,其他默认
在这里插入图片描述

至此,你就可以愉快的编写C++程序了。

五、配置Opencv

参考文章:Ubuntu系统中安装OpenCV 4
在ubuntu下配置opencv可能是新手最容易被劝退的环节了。其实多配几次,重装几次系统,把每条指令搞明白,就会觉得配置环境也不过如此了。

在这部分,我会介绍如何在ubuntu16.04下配置安装opencv3.4.14版本。配置其他版本的opencv方法大同小异,读者可以根据自己的需要自行调整。

1.下载opencv

下载地址:opencv官网
点击Sources进行下载自己需要的版本
在这里插入图片描述

2.安装opencv

2.1解压
解压后,将文件夹放自己喜欢的地方,笔者这里就放在了自己的用户目录下(请无视掉其他文件
在这里插入图片描述

2.2安装OpenCV需要的依赖项
由于最新版的OpenCV 4需要CMake 3.5.1版本,因此需要保证电脑中安装的CMake编译器版本高于3.5.1。
依次输入如下命令

sudo apt update
sudo apt install build-essential cmake

OpenCV 的使用会需要很多的依赖项,例如图片编码库、视频编码库等。不过这些依赖是针对某些特定的功能,即使某些功能的依赖项没有安装,也不会影响OpenCV 的编译与使用,只是在使用特定功能时会出现问题。因此在不确定某型功能以后会不会用到时,建议将常用的依赖都安装上

sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libatlas-base-dev gfortran libgtk2.0-dev libjpeg-dev libpng-dev

PS:安装依赖的时候别吝啬你的内存空间,能敲的命令都敲一遍,系统里没有的包会自动给你安装上,安装过的就不会再给你安装。

2.3编译和安装Opencv
利用“Ctrl+Alt+T”组合按键唤起终端,通过终端进入到下载的OpenCV-3.4.14的文件中,并创建名为“build”的文件夹,之后进入该文件夹中,准备进行编译和安装。

cd opencv-3.4.14
mkdir build
cd build

创建一个新的文件夹的目的是为了接下来编译的时候将编译出的中间文件都生成在这个新的文件夹中,这样做不会因为编译过程中生成的文件将原文件夹中的内容变得混乱,这种方式在Ubuntu系统中非常常见。

接下来开始编译工作

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv3.4.14 ..

命令中“CMAKE_BUILD_TYPE”是编译的模式参数,“CMAKE_INSTALL_PREFIX”是安装路径参数。这些参数都可以缺省,但是如果在安装多个版本的OpenCV时,设置不同的安装路径将变得十分有必要。这里我将opencv设置安装在了/usr/local/opencv3.4.14下。
第一行命令的最后一定不要忘记有一个“…”指令,其含义是告诉编译器将要编译的文件是来自上一层文件夹中的CMakeList.txt文件。
报错预警:笔者在编译的过程中,卡在IPPICV: Download: ippicv_2020_lnx_intel64_20191018_general.tgz这条提示上。
原因是这个文件放在https://raw.githubusercontent.com上,国内下载速度极慢,很有可能下载失败。
解决方法是手动在网上找到这个文件将其下载,把他放到ubuntu系统下的你喜欢的文件夹下。接下来修改如下所示的这个文件

/home/username/opencv-3.4.14/3rdparty/ippicv/ippicv.cmake

找到"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/"
将其改为你你保存ippicv_2020_lnx_intel64_20191018_general.tgz文件的路径。由于我把这个文件直接放在了用户目录下,因此修改成“/home/test”即可(这个test是我的用户名).保存文件后重新编译,一气呵成及其丝滑。

在这里插入图片描述

编译的过程中如果提示你缺少哪个库文件,你就去安装哪个库文件。安装的方法根据提示去百度寻找方法。

下一条命令是完成最终的编译,“-j4”的意思是启用4个线程同时进行编译,可以根据自己计算机的性能自主选择,例如,启用8个线程“-j8”,只用单线程可以缺省。

sudo make -j4

经过漫长的等待编译完成后,输入下一条指令将opencv安装到上上条指令指定的路径下

sudo make install

2.4环境配置
安装OpenCV 之后还需要通过配置环境告诉系统安装的OpenCV在哪里,按照如下步骤操作即可完成环境配置
首先执行这条指令,可能会打开一个空白的文件,但是无论是否为空白文件,都需要在末尾添加路径“/usr/local/opencv3.4.14/lib”。这里添加内容与我们编译时设置的路径有关,如果安装路径变化,这里添加的内容也要随之改变。

sudo gedit /etc/ld.so.conf.d/opencv.conf

保存文件并退出后,使用sudo ldconfig命令将配置路径生效。

接下来需要配置bash,在终端通过下面这条命令打开bash.bashrc文件,

sudo gedit /etc/bash.bashrc

在打开的文件末尾加上OpenCV的安装路径,代码如下面所示:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opencv3.4.14/lib/pkgconfig
export PKG_CONFIG_PATH

这里需要重点说明的是,文件路径需要与设置的安装路径相对应。
另外, opencv4的版本取消使用了pkgconfig,在正常安装途径下你是找不到pkgconfig的。(这里被坑了好久)

保存输入内容后,通过下面两条命令更新系统的配置环境,最终完成了OpenCV 3.4.14的安装。

source /etc/bash.bashrc
sudo updatedb

3.测试

一个简单的测试方式是输入pkg-config --modversion opencv来查看安装的opencv的版本。如果安装成功,则显示你安装的opencv的版本。
再次提醒,opencv4之后的版本取消使用了pkgconfig,输入pkg-config相关的指令是不会有反映的。
在这里插入图片描述

如果想确认真的安装成功了,就得确认能否通过程序调用OpenCV 函数库中的函数。
首先我们需要创建一个文件夹,在文件夹中创建 “CMakeLists.txt”文件和“main.cpp”文件两个文件,并在文件夹中复制一张名为“apple.jpg”的图片。在“CMakeLists.txt”文件中内容如代码所示。

cmake_minimum_required(VERSION 2.6)
#创建工程
project(testopencv)
#C++版本为11
set(CMAKE_CXX_FLAGS "-std=c++11")
set(OpenCV_DIR /home/teach/Desktop/opencv-3.4.14/build/) #手动设定OpenCV_DIR路径
find_package(OpenCV REQUIRED) #找OpenCV 安装路径
include_directories(${OpenCV_INCLUDE_DIRS}) #加载OpenCV的头文件

add_executable(testopencv main.cpp) #将程序生成可执行文件
target_link_libraries(testopencv ${OpenCV_LIBS}) #链接lib文件到可执行文件中

注意:1.由于OpenCV库基于C++11标准编写,因此必须在“CMakeList.txt”文件中声明set(CMAKE_CXX_FLAGS “-std=c++11”)
2.如果opencv不是安装在默认目录,设置cmakelists就必须手动指定OpenCV_DIR的值,路径为你建立的build文件夹的路径。参考文章:find_package()详解

在“main.cpp”文件中输入程序如代码所示。

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv; //声明使用OpenCV的命名空间

int main(int agrc, char** agrv){
    Mat img=imread("apple.jpg");
    imshow("test",img);
    waitKey(0);
    return 0;
  }

在当前文件夹下输入以下两条指令进行编译

cmake .
make

如果没有报错那么恭喜你配置成功了。
看一眼编译完成后的文件夹
在这里插入图片描述
输入./testopencv 运行可执行文件
图片有点大但无伤大雅
显示图片成功。

六、使用QTcreator运行opencv程序

在安装完qtcreator和opencv后,如果我们想要使用强大的IDE对程序进行编写和调试,就得学会如何使用安装好的qtcreator来运行opencv程序。
1.打开qtcreator
终端输入qtcreator,回车即可打开qtcreator。
右键菜单上的qt图标,点击锁定到启动器,下次启动qtcreator就不用再输命令了。
在这里插入图片描述
2.创建新工程
在欢迎页面点击New Project
在这里插入图片描述
选择其他项目中的Empty qmake Project可以创建一个空的项目。
在这里插入图片描述

创建完成后右键项目目录添加一个源文件
在这里插入图片描述
3.配置pro文件
双击进入pro文件,可以看到pro文件是整个项目的工程文件。
在这里插入图片描述

pro文件用于控制qmake来生成makefile文件。其中可以指定需要编译的源文件和头文件,导入库,编译器选项和项目配置等等。通常这一切都是IDE帮我们自动生成的,但有时候我们需要进行一些特殊的设置,就得手动修改pro文件。

网上的教程总是要求我们在pro文件里加入大量的include和lib配置,实际上通过配置环境变量的方式可以让我们很便捷的将库文件导入到我们的工程中。

在pro文件添加以下几行代码:

#Libraries
CONFIG += link_pkgconfig
#OpenCV
PKGCONFIG += opencv
#C++14
CONFIG += c++14

CONFIG += link_pkgconfig和PKGCONFIG += opencv可以使用我们配置在环境变量中的PKG_CONFIG_PATH,使其找到我们安装的opencv库文件。CONFIG += c++14允许我们使用C++14标准的特性。
再次提醒,opencv4以上的版本没法使用这个方法,基本上还是靠自己手动添加库文件进去,没有找到其他更好的办法。因此我只做了opencv3的教程。如果有更好的配置方法,希望能够告知我。

加入这三条代码之后我们就可以使用qtcreator编写opencv和C++14标准的程序了。

4.测试程序
在main文件中输入之前测试opencv的程序:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv; //声明使用OpenCV的命名空间

int main(int agrc, char** agrv){
    Mat img=imread("Zofia.jpg");
    imshow("test",img);
    waitKey(0);
    return 0;
  }

右键项目目录,点击构建
在这里插入图片描述
如果没有报错,那么恭喜你,历经重重苦难,终于已经能够使用qtcreator运行opencv了,生成了可执行文件:
在这里插入图片描述
其中,learnOpencv文件夹是放置我们源码的文件夹,build-learnOpencv-unknown-Debug是我们构建项目所生成的文件。文件名在创建项目时均能设置。
将我们的测试图片放进build-learnOpencv-unknown-Debug内,
在这里插入图片描述
在qtcreator左下角的绿色小三角里点击运行。

在这里插入图片描述
不出意外,运行成功。


碎碎念

本篇文章基本涵盖了使用ubuntu编写opencv程序基本全过程,限制于篇幅,一些容易踩到的坑没有细讲,望读者能够善用搜索引擎。
写这篇文章的初衷是为在学校内做培训撰写的学习资料,同时也是自己入坑ubuntu跌打滚爬日子中的一点总结,望后人能少踩点坑,省下一点在CSDN屎里淘金的精力,多学点有用的东西。
花了好几天,总共一万余字,终于写完了。为了确保文章内容的正确性,每一条指令都经过我自己的亲自验证,能踩的坑基本上都踩了一遍,同样也确保了跟着我的教程来配置环境基本是不会出什么大问题的,如果有什么遗漏的地方,也请大家指正。
以上