在读学生自学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

https://blog.csdn.net/sunzhao1000/article/details/103293877https://blog.csdn.net/sunzhao1000/article/details/103293877

上面这篇文章里面介绍的东西相对来说比较详细,但是有一个问题就是,在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,重新编译。

  • 17
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值