Matplotlib-cpp:C++中的编译及引用

Matplotlib是python中一个实用的绘图工具模块,网友将其移植到c++平台,构建了工具库matplotlib-cpp,总体来讲这个库还是挺实用的,可以用来在c++程序中输出一些简单图像,目前还在不断地完善中。本文介绍matplotlib-cpp在Windows平台上的编译和应用案例。

预置环境

环境准备

  • Cmake
  • VisualStudio
  • Python (安装 Numpy、matplotlib 扩展 )

本机环境

  • VisualStudio2015
  • Python 3.9.5 x64

下载matplotlib

https://github.com/lava/matplotlib-cpp.git

解压后如下

C++ 引用matplotlib-cpp 1

编辑WinBuild.cmd

WinBuild.cmd

# vs版本 14->vs15 15->vs17
# 发行方式 Release
# 本地python路径

if NOT DEFINED MSVC_VERSION set MSVC_VERSION=14
if NOT DEFINED CMAKE_CONFIG set CMAKE_CONFIG=Release
if NOT DEFINED PYTHONHOME   set PYTHONHOME=C:/Development/Python/Python39

C++ 引用matplotlib-cpp 2

python 系统环境变量

高级系统设置 > 环境变量 > 系统变量栏 > 点击 Path 加入python路径

Cmake编译

CMakeLists.txt

  • 把 CMakeLists.txt 复制到 contrib 文件夹中,同时编辑之,去掉 整个# Examples 代码段

C++ 引用matplotlib-cpp 3

cmake 文件夹

  • 把 cmake 文件夹 复制到 contrib 文件夹中

contrib 文件夹结构

  • 最后contrib 文件夹中结构如下

C++ 引用matplotlib-cpp 4

命令行编译

  • 打开命令行编译,无异常报错编译通过即可
cd C:\Development\ThirdPartyLib\matplotlib\contrib
WinBuild.cmd

C++ 引用matplotlib-cpp 5

VS项目环境配置

编辑完成后,就可以开始配置vs项目,此时matplotlib相当于一个第三方库,调用即可

新建项目

C++ 引用matplotlib-cpp 6

设置为 Release x64

  • 目前支持 Release x64,本文未进行Debug配置,具体可搜索网文参考

包含目录

  • VC++目录–>包含目录:需要包括 python、numpy、matplotlib
C:\Development\Python\Python39\include
C:\Development\Python\Python39\Lib\site-packages\numpy\core\include
C:\Development\ThirdPartyLib\matplotlib

C++ 引用matplotlib-cpp 7

库目录

  • VC++目录–>库目录:需要包括 python
C:\Development\Python\Python39\libs

C++ 引用matplotlib-cpp 8

链接器

  • 链接器–>输入–>附加依赖项:_tkinter.lib、python3.lib、python39.lib

C++ 引用matplotlib-cpp 9

测试编译

// 不需要拷贝matplotlibcpp.h到本项目中,include就行
#include "matplotlibcpp.h"

namespace plt = matplotlibcpp;
int main() {
    plt::plot({ 1,3,2,4 });
    plt::show();
}

存在报错

重复定义

  • 报错如下
C2766   显式专用化;已定义“matplotlibcpp::detail::select_npy_type<int64_t>”  pythonSet   C:\Development\ThirdPartyLib\matplotlib\matplotlibcpp.h 354

C2766   显式专用化;已定义“matplotlibcpp::detail::select_npy_type<uint64_t>” pythonSet   C:\Development\ThirdPartyLib\matplotlib\matplotlibcpp.h 356
  • 注释 matplotlibcpp.h 中该段内容
/*
static_assert(sizeof(long long) == 8);
template <> struct select_npy_type<long long> { const static NPY_TYPES type = NPY_INT64; };
static_assert(sizeof(unsigned long long) == 8);
template <> struct select_npy_type<unsigned long long> { const static NPY_TYPES type = NPY_UINT64; };
*/

C++ 引用matplotlib-cpp 10

python版本

  • 注意py的版本要与编译环境位数设置相同

无法引用 Python.h

  • 已经完整设定VS环境,却一直报错无法引用 Python.h,此时建议重新新建一个项目(重启电脑、VS软件可能都无法解决)

参考

参考文档中可能没有悉数列出步骤,有些不仔细的地方,需要琢磨

https://blog.csdn.net/stjuliet/article/details/104185132
https://cloud.tencent.com/developer/article/1588309
https://mangoroom.cn/cpp/call-matplotlib-on-cpp.html
https://zhuanlan.zhihu.com/p/310073847

其他

Debug模式

  • 由于下载的python是Release版本,Debug模式不支持,可以参考该文相关说明

    https://blog.csdn.net/stjuliet/article/details/104185132

  • 或者在Debug模式中引用release编译

    https://mangoroom.cn/cpp/call-matplotlib-on-cpp-2-html.html

直接调用python

  • 也可以直接调用python,让python自己调用matplotlib扩展进行作图

https://www.freesion.com/article/21641421026/
https://www.tqwba.com/x_d/jishu/356370.html

标题:Matplotlib-cpp:C++中的编译及引用
链接:http://www.outblue.cc/14
来源:OutBlue Blog
说明:文章版权本站所有,欢迎转载分享,望能备注出处
THE END
分享
二维码
< <上一篇
下一篇>>