文章目录
前期准备
ubuntu18.04安装vscode和opencv3.4.6教程:
只用完成“一”部分就ok
Linux之cmake入门:
我们采用外部构建的方式,如果你不知道外部构建,先看看这个
我们只构建一个最简单的OpenCV项目,想要更合理的结构请看参考链接。
一、准备
mkdir code
cd code
gedit main.cpp
main.cpp内容:
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat mat(400,300,CV_8UC3,Scalar(255,215,0));
cout<<"hello opencv\n";
imshow("image",mat);
waitKey();
return 0;
}
二、构建CMakeLists.txt
1.指令
cd code
gedit CMakeLists.txt
[内容]
# project name
PROJECT(HELLO)
# using C++11
set(CMAKE_CXX_FLAGS "${CAMKE_CXX_FLAGS} -std=c++11 ")
# cmake version
CMAKE_MINIMUM_REQUIRED(VERSION 3.10)
# find OpenCV
FIND_PACKAGE(OpenCV REQUIRED)
# show the message of OpenCV
message(STATUS "OpenCV library status:")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " headers: ${OpenCV_INCLUDE_DIRS}")
message(STATUS " libraries: ${OpenCV_LIBS}")
# link headers
INCLUDE_DIRECTORIES({OpenCV_INCLUDE_DIRS})
# 添加源代码文件到SRC_LIST变量中
AUX_SOURCE_DIRECTORY(. SRC_LIST)
# 生成可执行文件
ADD_EXECUTABLE(hello ${SRC_LIST})
# after ADD_EXECUTABLE,为生成文件target添加库
TARGET_LINK_LIBRARIES(hello ${OpenCV_LIBS})
2.解析:
(1)环境
set(CMAKE_CXX_FLAGS "${CAMKE_CXX_FLAGS} -std=c++11 ")
使用c++11编译
CMAKE_MINIMUM_REQUIRED(VERSION 3.10)
cmake最低版本
(2)FIND_PACKAGE()
FIND_PACKAGE(<name> [major.minor] [QUIET] [NO_MODULE]
[[REQUIRED|COMPONENTS] [componets...]])
参数:
- REQUIRED 参数
如果使用了这个参数,说明这 个链接库是必备库,如果找不到这个链接库,则工程不能编译。
功能:
只找一个名为name
的包(后面都是修饰条件),所以如果要找多个包,要分多个FIND_PACKAGE()
写。
此处:
当它找到OpenCV程序库之后,就会帮助我们预定义几个变量,OpenCV_FOUND
、OpenCV_INCLUDE_DIRS
、OpenCV_LIBRARY_DIRS
、OpenCV_LIBRARIES
,它们分别指是否找到OpenCV,OpenCV的头文件目录,OpenCV的库文件目录,OpenCV的所有库文件列表。
我们后面需要用到OpenCV_INCLUDE_DIRS
、OpenCV_LIBRARY_DIRS
,不写它这几个变量就无效,所以它必不可少。
(3)INCLUDE_DIRECTORIES()
include_directories(
${OpenCV_INCLUDE_DIRS}
)
链接头文件
(4)TARGET_LINK_LIBRARIES()
TARGET_LINK_LIBRARIES(target library1 <debug | optimized> library2...)
这个必须写在ADD_EXECUTABLE()之后,为生成文件target添加库。
三、执行
mkdir build
cd build
cmake ..
make
./hello
路径:
- code
- build
- buildPic.png
- main.cpp
- CMakeLists.txt
- codePic.png
- build
四、路径问题
1.CMakeLists.txt中
本目录为CMakeLists.txt所在目录(code下)
所以
AUX_SOURCE_DIRECTORY(./src/main SRC_LIST)
AUX_SOURCE_DIRECTORY(./src/serial SRC_LIST)
AUX_SOURCE_DIRECTORY(./src/mercure SRC_LIST)
2.cmake编译
本目录认为是终端所在路径(build下),要编译CMakeLists.txt所在的目录(build的父目录下包含CMakeLists.txt,所以是cmake ..
)
3.代码中
(1)预编译指令
本目录是本代码源文件所在目录(src/main下)
#include "../serial/SerialUtil.hpp"
(2)函数部分
同cmake编译,本目录认为是终端所在路径(build下)
// main.cpp中main()中
Mat tree = imread("../src/main/tree.jpeg");