CMake构建boost python的写法

最近需要用到python的胶水功能,即python调用c++,将源文件编译成.so,然后在python中import即可以用到此动态库文件。同时,原始项目是使用cmake构建的,所以也希望用cmake构建boost python。找了好长时间没有合适教程并且出现了一些问题,在这里总结一下,欢迎补充和交流

参考地址:https://stackoverflow.com/questions/52929146/boostpython-and-cmake

hello_ext.cpp

#include <boost/python.hpp>
#include <iostream>
extern "C"
char const* greet()
{
   return "hello, world";
}

BOOST_PYTHON_MODULE(libhello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}
int main(){
    std::cout<<greet()<<std::endl;
    return 0;
}

此文件可以作为一个简单示例,#include <boost/python.hpp>是boostpython编程需要的头文件。这里要注意BOOST_PYTHON_MODULE(libhello_ext)括号中的内容要与生成动态文件库同名(cmake生成的名称前面加上了lib,这里是为了凑名称相同,具体原因没搞清楚)。有了源文件,在Ubuntu系统下可以直接使用Makefile,这里也列举出来。

# location of the Python header files
PYTHON_VERSION = 27
PYTHON_DOT_VERSION = 2.7
PYTHON_INCLUDE = /usr/include/python$(PYTHON_DOT_VERSION)
# location of the Boost Python include files and library
BOOST_INC = /usr/include
BOOST_LIB = /usr/lib/x86_64-linux-gnu/
# compile mesh classes
TARGET = hello_ext
$(TARGET).so: $(TARGET).o
    g++ -shared -Wl,--export-dynamic $(TARGET).o -L$(BOOST_LIB) -lboost_python-py$(PYTHON_VERSION) -L/usr/lib/python$(PYTHON_DOT_VERSION)/config-x86_64-linux-gnu -lpython$(PYTHON_DOT_VERSION) -o $(TARGET).so
$(TARGET).o: $(TARGET).cpp
    g++ -I$(PYTHON_INCLUDE) -I$(BOOST_INC) -fPIC -c $(TARGET).cpp

注意复制的时候g++前面是Tab。这里主要说的是Cmake,给出Cmake的代码,cmake每一行的含义可以找教程看一看,我看懂了也会更新的。

cmake_minimum_required(VERSION 3.6)
PROJECT(hello_ext)

# Find Boost
find_package(Boost REQUIRED COMPONENTS python-py27)

set(PYTHON_DOT_VERSION 2.7)
set(PYTHON_INCLUDE /usr/include/python2.7)
set(PYTHON_LIBRARY /usr/lib/python2.7/config-x86_64-linux-gnu)

include_directories(${PYTHON_INCLUDE} ${Boost_INCLUDE_DIRS})

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -lrt -O3")

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
SET(LIBNAME hello_ext)

add_library(${LIBNAME} SHARED hello_ext.cpp)
#add_executable(${PROJECT_NAME} hello_ext.cpp)

TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${Boost_LIBRARIES} -lpython2.7 -fPIC)
TARGET_LINK_LIBRARIES(${LIBNAME} ${Boost_LIBRARIES} -lpython2.7 -fPIC -shared)

测试结果:

                   

出现问题1:pyconfig.h no such file

可以的解决方法:在make之前

export CPLUS_INCLUDE_PATH=/usr/include/python2.7

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值