看pybind11的官方文档
1.这是一个全部为头文件的库,所用使用简单,可直接从github下载这个项目
2. 需要有两个文件,一个是你定义的class类,一个是python绑定的cpp文件
#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");
}
单个文件的编译很简单,主要是加pybind11的include和python的include,编成一个动态库,注意动态库的命名要和module的一致
c++ --shared -fPIC a.cpp -o example.so -I ../3rdparty/pybind11/include/ $(python3-config --includes)
我一开始编译成a.so, 然后在python里import a,报错“ImportError: dynamic module does not define module export function (PyInit_a)”,就是这个动态库没有定义a module,想起来我源码里面module叫example,于是重新编译example.so. 现在可以了
也可以通过cmake编译
可以构建这样的目录结构
|-- 3rdparty
| |-- pybind11
-- Chun
| |-- chun.h
-- PyChun
| |-- src/pychun.cpp
| |-- CMakeLists.txt
| |-- chun.py
-- example
| |-- test.py
cmake_minimum_required(VERSION 2.8)
project(xxx)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC)
include_directories("${PROJECT_SOURCE_DIR}/../3rdparty/pybind11/include")
include_directories("${PROJECT_SOURCE_DIR}/../chun")
set(Python3_EXECUTABLE python3)
execute_process(
COMMAND bash -c "${Python3_EXECUTABLE} -c 'import sysconfig; print(sysconfig.get_path(\"include\"))'"
OUTPUT_VARIABLE PYTHON_INCLUDES
)
include_directories(${PYTHON_INCLUDES})
FILE(GLOB_RECURSE MODULE_SRCS ${PROJECT_SOURCE_DIR}/**.cpp)
set(modulename "example")
add_library(${modulename} SHARED ${MODULE_SRCS})
SET_TARGET_PROPERTIES(${modulename} PROPERTIES PREFIX "")
target_link_libraries(${modulename})
需要注意的是,这里生成的so会默认带前缀,这里要把前缀去掉,才和module名称一致
SET_TARGET_PROPERTIES(${modulename} PROPERTIES PREFIX "")
然后在这个so的目录下,就可以
>>>import example
>>>example.add(1,2)
>>>3