win10下配置和使用pybind10, visual stdio2019+pycharm
前言:
从2022年4月9日安到了4月14日,真差不多弄了一周,中间包括摆烂的时间,弄环境实在太折腾了,弄出来真的是太不容易了。
环境:
window10
visual stdio2019
pybind11-2.9.0
Pycharm 2021.3.3
参考博客:
官方手册 First steps — pybind11 documentation
pybind11使用 - 简书 (jianshu.com) 主要参考
(1条消息) 【pybind11】windows下,关于C++与python之间的调用_小林做笔记的博客-CSDN博客_c++调用pyd文件 visual2019参考
大体步骤主要参考 https://blog.csdn.net/qq_44843469/article/details/122116098
踩坑记录:
-
pybind11使用 - 简书 (jianshu.com) 用这个方法,即在visual stdio直接配置的方法,可以生成pyd文件,但是只能在命令行中运行,不能在pycharm中调用。
-
由于 pyd文件要和python版本相对应, 我想要在pycharm中使用python38,但是一直生成的是example.cp39-win_amd64,发现是因为我的系统默认的python是39的,关于cmake修改python版本的博客找不到,于是想到用改系统默认的python版本的方法解决。更换系统python版本,参考 https://blog.csdn.net/weixin_42312791/article/details/80977654 ,但是很奇怪的是这个方法一开始好有效,又变得没有效果了。所以再后来我想到了直接新建一个Anaconda新环境,把Python文件和C++文件,都放在同个环境下,那么Cmakelist使用的python版本肯定是这个新环境下的了。
-
我一开始是使用pybind11的最新版本,就是2022年3月份更新的版本,但是总是会报错 “pybind11::overload_cast”必须初始化“constexpr”对象,
后来发现如果改用pybind2021年的版本,即2.9.0以前的版本,就不会再报错了。
预备步骤
-
下载cmake
打开命令行,输入
pip install cmake
-
从pybind11 https://github.com/pybind/pybind11 下载整个压缩包下来。
配置步骤
1.在anaconda下创建一个新环境
conda create -n 名字 python=3.9
后面会出现 Proceed ([y]/n)? ,就输入y就可。
我输入的是
conda env list #查看列表里的环境
conda create -n envTest1 python=3.8 #新建环境
2.新建好新环境后,打开该文件夹,在下面建一个C++project文件夹
3. 打开visual stdio,选择创建 空项目,创建的项目取名叫TesePybind,放在刚刚创建的C++project里

4. 放好pybind11
把刚刚从官网下载的 pybind11-2.9.0 放到C++project里,并解压,里面会是这样的pybind11-2.9.0\pybind11-2.9.0
,把第2个pybind11-2.9.0 文件夹直接提到E:\software\Anaconda3\envs\envTest1\C++project\TesePybind
里,并且改名为pybind11。
使得pybind打开就如下图

5.配置visual stdio
(1)点击属性,
(2)包含目录中包含刚刚弄好的pybind文件夹下的include,和当前环境envTest1下的include
(3)库目录选择当下环境下的libs
(4)这个附加依赖性设置,我还不明白是干什么用的,我填写的内容是根据 E:\software\Anaconda3\envs\envTest1\libs
下的东西写的。
6. 创建main.c文件 和CMakeLists.txt 文件
直接使用了来自于First steps — pybind11 documentation 的例程
#include <pybind11/pybind11.h>
int add(int i, int j) {
return i + j;
}
PYBIND11_MODULE(example, m) {
m.doc() = "pybind11 example plugin"; // optional module docstring
m.def("add", &add, "A function that adds two numbers");
}
CMakeLists.txt 文件 如下
cmake_minimum_required(VERSION 2.8.12) #这个是cmake编译后的工程名,可以自己定义
project(example)
add_subdirectory(pybind11)
pybind11_add_module(example main.cpp) //括号内第一个为工程名,和上面一样,后面包含我们需要的所有文件
7.使用cmake
打开cmake的GUI界面
第2个是写 项目的位置,就是第1个的位置再补一个/build,它待会会自动创建这个文件夹。
点击左下的configure,得到如图,点yes
填x64
变成这样后,点Generate,最后会 新增一条信息“Generating done” ,然后 Open Project会变白,点击就可以打开新生成的工程
8.在由cmake打开的新项目 example里,生成pyd 文件
(1)点击生成

会出现如图
(2)打开如下文件夹,就可以找到pyd文件
9.新建一个pycharm项目在刚刚那个环境下
注意编译器选择刚刚那个虚拟环境下的python.exe
10.把生成的那个 pyd文件放到当前虚拟环境的Lib中去
11.测试
这时import的时候就会出现example这个包了。
import example
a=example.add(2,3)
print(a) //打印5