使用Pybind11链接c++和Python
前期准备
Visual Studio
cmake
文件顺序
注:忽略这里的cmake-build-debug文件夹,这个是Clion自己生成的,所以这里只需要新建externals和source文件夹
- externals文件夹里存放pybind11的源代码,可以在github上下载,https://github.com/pybind/pybind11/releases,直接下载source code,之后解压到externals文件夹(这里我将其重命名为pybind11)
- source文件夹里新建app和module文件夹,分别新建app.cpp和module.cpp,之后在module.cpp里编写C++代码
编写cmake
在CMakeLists.txt文件中编写cmake代码(我这里在Clion中编写,但是没所谓,用记事本也行)
cmake_minimum_required(VERSION 3.17)
project(pybind11_example)
set(CMAKE_CXX_STANDARD 14)
set(APP_SOURCE "${PROJECT_SOURCE_DIR}/source/app")
set(MODULE_SOURCE "${PROJECT_SOURCE_DIR}/source/module")
set(EXTERNALS "${PROJECT_SOURCE_DIR}/externals")
# pybind11
add_subdirectory(${EXTERNALS}/pybind11)
# module
pybind11_add_module(
pybind11module # 这里和构建之后的包名一致
${MODULE_SOURCE}/module.cpp
)
target_include_directories(
pybind11module
PRIVATE ${MODULE_SOURCE}
)
# app
add_executable(
pybind11app
${APP_SOURCE}/app.cpp
)
target_include_directories(
pybind11app
PRIVATE ${APP_SOURCE}
PRIVATE ${MODULE_SOURCE}
)
target_link_libraries(
pybind11app
PRIVATE pybind11::embed
)
add_executable(pybind11_example source/app/app.cpp)
编写module.cpp代码
我们在module.cpp中编写c++代码,这里我以hello world为例编写C++代码并且构建之后import 在ipython中输出
#include <iostream>
#include <pybind11/pybind11.h>
#include <cstdio>
void say_hello(){
printf("Hello World\n");
}
PYBIND11_MODULE(pybind11module, module){
module.doc()="Pybind11Module";
module.def("say_hello", &say_hello);
}
构建
在Visual Studo中打开该项目文件
Visual Stuio会自动进行CMake生成
然后点击module.cpp进行构建(注意这里选择x64平台而不是x86)
构建完成后会报一个错,这个是因为VS会把生成的pyd文件当做exe文件打开,这个必然是打不开的,所以会报错。之后你会发现在根目录下VS会生成一个out文件夹,里面存放着pyd文件。
构建的成功与否在于你的out文件里是否有pyd文件。
在Python中import
一点需要注意的地方
-
为什么不直接使用Clion的MinGW32构建?
我试过,但是在import的时候会出现找不到DLL文件的错误,所以借用VS构建。
可以看这个issue,https://github.com/pybind/pybind11/issues/2010
参考
https://www.youtube.com/watch?v=-eIkUnCLMFc&t=26s