my_module.cpp
#define PY_SSIZE_T_CLEAN
#define BOOST_PYTHON_MODULE_NAME my_module
//#include <pybind11/pybind11.h>
#include <boost/python.hpp>
int add(int a, int b) {
return a + b;
}
//PYBIND11_MODULE(libmy_module, m) {
// m.def("add", &add, "Prints a greeting from C++");
//}
BOOST_PYTHON_MODULE(libmy_module) {
using namespace boost::python;
def("add", add);
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.12)
project(kalibr-example)
# 查找 Boost.Python
find_package(Boost REQUIRED COMPONENTS python)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
set(Python_ADDITIONAL_VERSIONS 3.11) # 替换为您的 Python 版本
find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
#
#set(pybind11_DIR /home/local/.local/lib/python3.8/site-packages/pybind11/share/cmake/pybind11/)
#find_package(pybind11 REQUIRED)
add_library(my_module MODULE my_module.cpp)
#target_link_libraries(my_module PRIVATE pybind11::module)
target_link_libraries(my_module PRIVATE Boost::python)
python :main.py
import sys
import libmy_module
result = libmy_module.add(1, 2)
print ("result:{}".format(result))
出现的一个报错:
原因分析:
cmake生成的动态库名字为libmy_module.so
要和cpp代码中红框处的变量名保持一致才行
Boost.Python和pybind11区别
Boost.Python和pybind11都是用于在C++和Python之间进行绑定的工具,它们有一些区别和特点:
依赖性: Boost.Python是Boost库的一部分,因此使用Boost.Python需要安装和配置Boost库。而pybind11是一个独立的库,没有额外的依赖项,更容易使用和集成到项目中。
代码复杂性: Boost.Python在绑定C++和Python之间的交互时,使用了大量的宏和模板代码。这些代码可以让绑定变得更复杂,尤其对于大型项目来说。而pybind11使用更现代的C++特性,如类型推断和Lambda函数,使代码更简洁和易读。
性能: pybind11在性能方面通常比Boost.Python更好,因为pybind11使用了更优化的Python/C++ API调用和类型转换机制,同时也提供了更好的内存管理和异常处理。
语法风格: Boost.Python使用了一种更传统的C++风格的语法,包括宏定义和模板元编程。而pybind11使用了更现代的C++特性,如类型推断和Lambda函数,更接近于原生的C++编程风格。
总体而言,pybind11是一个相对较新、更简单和更高效的C++和Python绑定库,而Boost.Python则是一个更成熟和功能丰富的库。选择使用哪个库取决于项目的需求、开发团队的偏好以及与其他依赖项的集成等因素。