目录
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,会发现问题得到了解决。
成功的结果如下所示。