Ubuntu下使用c++调用matplotlibcpp绘图

目录

1. 下载并安装matplotlibcpp

2. 使用anaconda创建matplotlib绘图环境

3. 使用clion运行绘图程序

4. 解决anaconda的冲突问题

配置

Ubuntu22.04,Anaconda,clion,matplotlibcpp.h,matplotlib, numpy

1. 下载并安装matplotlibcpp

        matplotlibcpp包可以在Github上下载,但是下载的速度可能受到网络影响。可以选择直接在CSDN的GitCode下载,该方法的下载速度较快。下载地址为:mirrors / lava / matplotlib-cpp · GitCode,页面如下图所示。

        下载下来的matplotlibcpp包的名称为matplotlib-cpp-master.zip,将这个包解压成文件夹。

打开解压的matplotlib-cpp-master的文件夹,在这个文件夹下面新建名称为build的文件夹,如下图所示。

        Ctrl+Alt+T打开Ubuntu的Terminal打开终端窗口,使用cd切换到前面新建的build文件夹。或者,在新建的build内右键选择Open in Terminal打开终端窗口。在终端窗口内输入依次输入以下命令,并分别运行(make -j16中16由用户的计算机性能决定,可以适当调节,或直接使用make)。

cmake -DCMAKE_TYPE=None .. 

make -j16

sudo make install

        运行的结果分别如下所示:

        根据sudo make install的运行结果,我们可以在/usr/local/include/matplotlibcpp.h找到安装的matplotlibcpp调用包。

2. 使用anaconda创建matplotlib绘图环境

        使用anaconda创建含有matplotlib的环境,供matplotlibcpp.h调用。在安装好anaconda的Ubuntu终端窗口输入以下命令创建名称为forcppEnvs的python3.10环境(如果没有安装anaconda,请到Free Download | Anaconda下载并安装)。

conda create --name forcppEnvs python==3.10

        之后,分别运行pip命令,安装numpy和matplotlib,如下所示。

pip install numpy

pip install matplotlib

        运行结果如下所示(这里install numpy的图没有及时截取)。

3. 使用clion运行绘图程序

        打开JetBrains的C++IDE Clion,编写cmakelist和main.cpp运行matplotlib绘图。Pycharm和Clion都属于JetBrains,Clion下载地址为:CLion: A Cross-Platform IDE for C and C++ by JetBrains

cmakelist的编写可参考下面。

cmake_minimum_required(VERSION 3.26)
project(XXXXXXXXXXXXXX)
set(CMAKE_CXX_STANDARD 20)


......


# 添加python库
find_package(PythonLibs REQUIRED)
set(PYTHON_INCLUDE_DIRS /home/XXX/Envs/anaconda3/envs/forcppEnvs/include/python3.10)
set(PYTHON_LIBRARIES /home/XXX/Envs/anaconda3/envs/forcppEnvs/lib/libpython3.10.so)
include_directories(${PYTHON_INCLUDE_DIRS})
include_directories(/home/XXX/Envs/anaconda3/envs/forcppEnvs/lib/python3.10/site-packages/numpy/core/include)
message(STATUS "Python include dirs are: ${PYTHON_INCLUDE_DIRS}")
message(STATUS "Python library is: ${PYTHON_LIBRARIES}")


......


# 对库进行链接
target_link_libraries(
        XXXXXXXXXXXXXX

        ${PROJ_NAME}
        ${PYTHON_LIBRARIES})

测试用绘图程序为:

#include "Python.h"
#include "matplotlibcpp.h"
namespace plt = matplotlibcpp;

int main(int argc, char** argv){
    vector<double> x{1, 2, 3}, y{1, 2, 3};
    plt::figure_size(5, 5);
    plt::plot(x, y);
    plt::show();
}

        对前面编写的cmakelist进行编译,这时会出现如下问题,这个后面会解决。

        如果前面的编译通过了,将鼠标移动到#include "Python.h"  和  #include "matplotlibcpp.h"的位置,将会显示anaconda中的python3.10和前面安装的matplotlibcpp.h的位置。

        这个时候对main.cpp进行debug还会显示一个错误,这个也会在后面解决。

  4. 解决anaconda的冲突问题

        现在解决前面遇到的anaconda的冲突问题。

第一个问题:

        这个问题是因为anaconda的新建环境forcppEnvs的lib下有一个文件libgomp.so.1,但是,在/usr/lib/x86_64-linux-gnu下也有一个文件libgomp.so.1,这两个文件相互冲突了。为了保持原来的环境,这里选择删除anaconda里面冲突的libgomp.so相关文件或者将它们移动到其他位置暂时保存。即,从anaconda的forcppEnvs里面移除下图的三个文件(测试发现,只移除libgomp.so.1就可以成功运行mtplotlibcpp.h了)。当进行移除之后,重新对camkelist进行编译,会发现可以成功运行了,如下图所示。

第二个问题:

        第二个问题可以参考网址(Ubuntu系统anaconda报错version `GLIBCXX_3.4.30' not found_wx62830f4b679a4的技术博客_51CTO博客)。这个问题是因为anaconda的libstdc++.so.6支持的GLIBCXX版本最高到3.4.29。但是,ubuntu系统,也就是 /usr/lib/x86_64-linux-gnu/libstdc++.so.6支持的GLIBCXX版本最高到3.4.30。如下图所示。

        因此,选择移除anaconda的新建环境forcppEnvs的lib里面的下面三个文件。

之后,从 /usr/lib/x86_64-linux-gnu/向anaconda的新建环境forcppEnvs的lib添加链接。也就是,运行下面的命令(注意需要在anaconda的新建环境forcppEnvs的lib打开终端窗口再运行。如果不这样,那么ln -s命令的第二个路径就需要直接使用绝对路径)

上面的图可能不清楚,代码如下:

ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30 libstdc++.so

ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30 libstdc++.so.6

最后,回到clion,运行main.cpp,会发现问题得到了解决。

成功的结果如下所示。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值