入职前有关Pybind的学习,用时接近一天,终于把这块拿下了,心累!!!必须记录下来!
一、pybind相关基本知识
pybind11是一个轻量级的仅头文件库,是一个只有标题的库,因此不需要链接任何特殊的库,主要用于创建现有C++代码的Python绑定。可将pybind11库视为Boost.Python的一个小型自包含版本,其中剥离了与绑定生成无关的所有内容,依赖于python(2.7或3.5+)和C++标准库。
pybind11核心功能:pybind11可以将C++功能映射到Python。
pybind11支持的编译器:
(1).Clang/LLVM 3.3或更高版本;
(2).GCC 4.8或更高版本:注:编译2.9.1版本的test,GCC需要5以上版本;
(3).Visual Studio 2015或更高版本。
pybind11的安装:
(1).通过conda,执行:conda install -c conda-forge pybind11
(2).通过pip,执行:pip install pybind11
(3)官网下载源码(本次实践所用,下载地址是D:\VS2019code)
Linux:python dev/python3 dev、cmake
macOS(附带python):cmake
Windows:Visual Studio 2017及其更新版
二、实践结果总结
- 环境:
Window 10
visual stdio 2019
pybind11 2.9.0
Pycharm 2019.2.1
Cmake 3.23.2
2.配置过程:
(1)官网上下载pybind11:https://github.com/pybind/pybind11 (2)在anaconda上创建一个新的环境envTest1。
创建命令是 conda create -n envTest1 python=3.7
查看环境是否创建成功:conda env list
(3)创建成功后该环境地址为D:\anaconda\envs\envTest1,在envTest1文件夹下创建一个新的文件夹C++Project. - (4)打开vs2019,创建一个空项目,项目名称为TesePybind,地址为D:\anaconda\envs\envTest1\C++project\TesePybind。
- (5)将刚开始下载好的pybind源码压缩包进行解压,得到pybind11-master文件,将这整个文件复制到D:\anaconda\envs\envTest1\C++project\TesePybind 中,并重命名为pybind11。
- (6)开始配置vs2019
1)右键项目Tesepybind-属性 - 2)常规选项中,将配置类型设置为动态库(.dll):
- 3)在VC++目录中修改包含目录,其中红框中需填上新环境envTest1下include的目录以及TesePybind中pybind11下的include的目录(D:\anaconda\envs\envTest1\C++project\TesePybind\pybind11\include),非常重要!!!!
- 4)库目录下填写环境envTest1下的libs目录。
- 5)链接器-输入-附加依赖项中填写环境envTest1的libs中的所有文件目录。我这里有三个:python3.lib、python37.lib、_th=kinter.lib。注:有些资料里填的不是绝对路径,会报错!一定是绝对路径!!!!
- (7)在vs项目TesePybind中创建main.cpp文件和CMakeLists.txt:
- 此时,运行main.cpp无报错,说明pybind11配置成功!!!
- (8)配置cmake:
1)网上下载cmake安装包,我放在C++Project下,解压: - 2)打开cmake界面:
- 3)如图填好,下一个中的build会自动创建
- 4)点击左下角configure:
5)出现configuring done时,点击generate后会出现generating done(在configuring done的下一行)。
6)点击open Project,会生成一个新工程example(由cmake打开);
右击example-生成,会出现:
此时成功生成pyd文件,注意地址!
(9)在envTest1环境中,在pycharm中创建一个新的虚拟环境(pythonProject):file-new project。注意地址!
(10)如图所示:
(11)虚拟环境建成后,将之前得到的pyd文件复制到环境envTest1的Lib中:
(12)在pycharm中新建一个py文件,可以发现此时可以import到example这个库了!!!测试一下,输出结果,完成!!!!!
真不容易!!中间出来好几个报错,有惊无险!!