在读学生自学Ubuntu20.04用C++调用matplotlib历程
Posted Witty_Hou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在读学生自学Ubuntu20.04用C++调用matplotlib历程相关的知识,希望对你有一定的参考价值。
1.学习CMake
程序的编译需要用CMake,因此如果是Ubuntu小白的话,最好学一下。(小白的建议)
http://file.ncnynl.com/ros/CMake%20Practice.pdf
下载下来这篇文章,跟着里面的步骤从t1做到t4,并且自己适当扩展一下,因为后面我们所有需要用的东西都得依靠CMake。
这里是一个错误,需要将括号里的内容修改为hello $SRC_LIST
2.学习CMake编译C++文件
Ubuntu下Cmake编译C++程序Helloworld - HaijianYang - 博客园1、首选新建工程目录 mkdir helloworld 2、新建文件目录 cd helloworld mkdir bin mkdir lib mkdir src mkdir include mkdirhttps://www.cnblogs.com/haijian/p/12039160.html
上面这篇文章里面介绍的东西相对来说比较详细,但是有一个问题就是,在Part A源码部分,并没有指明a.h这个文件应该怎么写,就会导致在编译的时候出现问题。如果你有兴趣自己研究怎么写,可以模仿博客园这篇文章,它给出了详细的过程。如果觉得太难了,我也会在后面的网盘连接里把我写的分享给大家。
第二篇文章的Part B引用的第三方库Opencv与后面的matplotlib应用关系密切,需要安装。
仿照第二篇文章最后的文件及结果:
其中test.cpp文件
#include <iostream>
#include "a.h"
#include <opencv2/opencv.hpp>
#define NUM 100
int main()
A obt;
std::cout << NUM << std::endl;
std::cout << "Hello World!" << std::endl;
obt.a();
cv::Mat img = cv::imread("/home/wenke/laopo.jpg");//括号里要填写自己图片保存的路径
cv::namedWindow("老婆", 0);
cv::resizeWindow("老婆",640,480);
cv::imshow("老婆", img);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
CMakeList.txt每条语句在上面的第二篇文章中都有解释,不清楚的请反复观看!
运行结果:
3.安装Opencv
OpenCV 在 Ubuntu 20.04 软件源中可用。想要安装它,运行:
sudo apt update
sudo apt install libopencv-dev python3-opencv
上面的命令将会安装所有必要的软件包,来运行 OpenCV:
通过导入cv2
模块,并且打印 OpenCV 版本来验证安装结果:
python3 -c "import cv2; print(cv2.__version__)"
在写作的时候,软件源的版本是 4.2:
输出:4.2.0
4.检查Ubuntu的python版本
方法一:在/usr/lib目录下可以找到已经下载的各个版本的python
方法二:
5.安装python-pip
如何在 Ubuntu 20.04 上安装 Python Pip - ITCoder
如果有python3及其以上的版本,只安装为python3那部分就可以。
6.安装locate
安装方式:在终端输入
sudo apt install locate
locate指令可以便捷地查询各种文件的地址
例如:
7.安装numpy和matplotlib
在Ubuntu上安装python3及numpy和matplotlib_WILDCHAP_的博客-CSDN博客
安装完成之后可以通过pip指令来查看库文件的位置:
8.下载c++调用matplotlib库时所需要的matplotcpp.h头文件
方法一:从github上下载,但是需要翻墙。
网址:
https://github.com/lava/matplotlib-cpp
方法二:如果你不会翻墙,我会把头文件给你放在网盘的链接里,自行下载。
9.使用matplotlibcpp.h绘制图形
编译我们会CMake进行,因此CMake是我们这些所有项目的基础,不会用的一定要去看看放在最开头的那个文档!
首先创建一个文件夹,内容为:
build是一个空文件夹,之后CMake编译的位置,用来放置编译文件和可执行文件。
CMakeList.txt内容:
cmake_minimum_required(VERSION 3.10)
project(mini CXX)
find_package(OpenCV REQUIRED)
include_directories($OpenCV_INCLUDE_DIRS)
set(CMAKE_CXX_STANDARD 11)
#指定库路径
file(GLOB_RECURSE Opencv3_LIB "/usr/lib/python3.8/config-x86_64-linux-gnu/*.so")
#指定头文件路径
set(Opencv4_INLCUDE_DIRS "/usr/include/python3.8")
#添加头文件到工程
include_directories(include $Opencv4_INLCUDE_DIRS)
# 通常这样设置就可以,如果你的项目包含qrc文件,那么需要将它们单独添加进来
aux_source_directory(. DIRS_SRCS)
add_executable(mini $DIRS_SRCS)
#添加库文件到工程
target_link_libraries(mini $Opencv_LIB)
target_link_libraries(mini libpython3.8.so)
其中可能会遇到的几个问题:
(1)如果你安装了matplotlib,但项目中没有放置matplotlibpp.h头文件和需要编译的cpp文件在统一目录,或者在CMakeList.txt没有用include_directories(头文件位置)来指明matplotlibpp.h的位置,那么会出现matplotlibpp.h不存在的问题
(2)如果你没有安装numpy库,在你运行的时候,就算你引用了matplotlibpp.h,但是编译时会出现matplotlibpp.h中的第20行头文件# include <numpy/arrayobject.h>不存在。
解决方法:set(Opencv4_INLCUDE_DIRS "/usr/include/python3.8")因为我的python3.8文件中有numpy头文件库,如果你的python3.8中没有,你可以新打开一个终端输入:
locate numpy
找到这个文件夹所在的位置,或者输入
pip show numpy
如图下半部分:
location:/usr/lib/python3/dist-packages
(3)报错显示:
很多很多很多这样类似的语句
/__multiarray_api.h:1451: undefined reference toPyImport_ImportModule’
/usr/include/python3.5/numpy/__multiarray_api.h:1455: undefined reference to PyExc_ImportError' /usr/include/python3.5/numpy/__multiarray_api.h:1455: undefined reference toPyExc_ImportError’
/usr/include/python3.5/numpy/__multiarray_api.h:1455: undefined reference to PyErr_SetString' /usr/include/python3.5/numpy/__multiarray_api.h:1458: undefined reference toPyObject_GetAttrString’
/usr/include/python3.5/numpy/__multiarray_api.h:1461: undefined reference to PyExc_AttributeError' /usr/include/python3.5/numpy/__multiarray_api.h:1461: undefined reference toPyExc_AttributeError’
/usr/include/python3.5/numpy/__multiarray_api.h:1461: undefined reference to PyErr_SetString' /usr/include/python3.5/numpy/__multiarray_api.h:1466: undefined reference toPyCapsule_Type’
/usr/include/python3.5/numpy/__multiarray_api.h:1466: undefined reference to PyCapsule_Type' /usr/include/python3.5/numpy/__multiarray_api.h:1467: undefined reference toPyExc_RuntimeError’
/usr/include/python3.5/numpy/__multiarray_api.h:1467: undefined reference to PyExc_RuntimeError' /usr/include/python3.5/numpy/__multiarray_api.h:1467: undefined reference toPyErr_SetString’
/usr/include/python3.5/numpy/__multiarray_api.h:1471: undefined reference to PyCapsule_GetPointer' /usr/include/python3.5/numpy/__multiarray_api.h:1482: undefined reference toPyExc_RuntimeError’
/usr/include/python3.5/numpy/__multiarray_api.h:1482: undefined reference to PyExc_RuntimeError' /usr/include/python3.5/numpy/__multiarray_api.h:1482: undefined reference toPyErr_SetString’
原因:没有链接python库
解决方法:
target_link_libraries(mini libpython3.8.so)
(4)报错:
ModuleNotFoundError: No module named 'matplotlib.pyplot'
原因:matplotlib库出错或者没有下载
解决方法:重新下载matplotlib库
mini.cpp内容:
#include "matplotlibcpp.h"
#include <vector>
namespace plt = matplotlibcpp;
int main()
std::vector<double> y = 1, 3, 2, 4;
plt::plot(y);
plt::show();
(5)Opencv相关问题
原因:Openc后的数字出现问题,下载的版本与写的不一致
解决方法:这个不敢保证,因为我在运行时没有遇到,但是可能会出现。如果你不知道自己Opencv的版本是多少,可以直接删除数字,我测试过,在我的电脑上可以运行。
如果你想知道opencv版本,可以通过
locate opencv
查看可以找到版本:4.2
如果觉得不会引用matplotlibcpp.h文件,直接把它和头文件放置在同一个目录下即可。
文件都准备完毕后,按照CMake的顺序,build目录打开终端
cmake .(.前有一个空格)(也可以有两个.)
make
./mini(./你生成的可执行文件名)
运行结果:
如果遇到其他问题,可以留言评论中提出来,或者可以添加我的QQ:3122899873
10.资料链接🔗
链接: https://pan.baidu.com/s/1vf0YJ9mDqCoLRcz02qBdyw 提取码: 8nu1
文件中我已经把我自己编译过的build删除了,并放置了一个空的build,因为CMakeList.txt中路径可能不一样,你直接运行不一定可行。并且就算路径相同也可能会遇到CMakeList.txt文件报错,如果遇到,解决方法就将build之外的所有文件复制到一个新的文件夹,新建一个build,重新编译。
以上是关于在读学生自学Ubuntu20.04用C++调用matplotlib历程的主要内容,如果未能解决你的问题,请参考以下文章
记录ubuntu20.04成功编译安装opencv4 c++环境
记录ubuntu20.04成功编译安装opencv4 c++环境
Ubuntu20.04设置静态IP(/etc/netplan添加yaml配置)