Boost Python基本示例不起作用

时间:2016-08-26 06:50:32

标签: c++ boost boost-python

尝试Boost Python Quick Start

中最简单的Hello World示例
#include <boost/python.hpp>

char const* greet()
{
    return "hello, world";
}

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

使用以下CMake在Windows上编译项目:

cmake_minimum_required(VERSION 3.2)
project(hello_ext CXX)
set(TARGET hello_ext)

set(BOOST_MIN_VERSION "1.61.0")
set(Boost_ADDITIONAL_VERSIONS "1.61.0" "1.61")
set(BOOST_ROOT ${MY_BOOST_DIR}) 

set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_STATIC_RUNTIME OFF)
set(Boost_USE_MULTITHREADED ON)

find_package(PythonLibs 3.4 REQUIRED )
find_package(Boost 1.61.0 COMPONENTS python REQUIRED) 

file(GLOB SOURCES *.cpp)

include_directories(${INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})

python_add_module(${TARGET} ${SOURCES})

target_link_libraries(${TARGET} ${Boost_PYTHON_LIBRARY} ${PYTHON_LIBRARIES})

模块成功编译为hello_ext.pyd。尝试从放在同一目录中的Python脚本访问它:

import hello_ext
print(hello_ext.greet())

获得以下执行结果:

  

python3 test_cpp.py

     

导入错误:DLL加载失败:找不到指定的模块

另外,尝试将hello_ext.pyd放到Python DLL目录(C:/ Python34 / DLLs)中,结果相同

Windows 7 32位

C ++编译器:Visual C ++ 2015

Python 3.4.2,Boost 1.61

更新:已解决,见下文

2 个答案:

答案 0 :(得分:0)

我添加了一个包含Boost Python * .lib和* .dll文件的目录到PATH。它使示例工作

答案 1 :(得分:0)

这是针对mac用户的,因为我尝试了上述解决方案,并且它对我使用osx el capitan不起作用。我有两个CMakeLists.txt,但是,我不认为它们是基于https://gitlab.kitware.com/cmake/cmake/issues/16335的问题。

PROJECT(example)
set(CMAKE_CXX_STANDARD 11)
set( CMAKE_EXPORT_COMPILE_COMMANDS ON )
cmake_policy(SET CMP0042 NEW)
set(EIGEN_DIR "/usr/local/include/eigen3/" )
set(PYTHON_INCLUDE_DIRS "//anaconda/include/python2.7")
set(PYTHON_LIBRARY "//anaconda/lib/libpython2.7.dylib")
find_package(Boost 1.66.0 COMPONENTS python)
if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS} ${EIGEN_DIR} ${PYTHON_INCLUDE_DIRS} include)
    set(Boost_USE_STATIC_LIBS OFF)
    set(Boost_USE_MULTITHREADED ON)
    set(Boost_USE_STATIC_RUNTIME OFF)
    add_library (yay MODULE src/example_ext.cpp)
    target_link_libraries(yay ${Boost_LIBRARIES} ${PYTHON_LIBRARY})
endif()

PROJECT(example)
set(CMAKE_CXX_STANDARD 11)
set( CMAKE_EXPORT_COMPILE_COMMANDS ON )
cmake_policy(SET CMP0042 NEW)
set(EIGEN_DIR "/usr/local/include/eigen3/" )
find_package(Boost 1.66.0 COMPONENTS python3)
if(Boost_FOUND)
    set(Boost_USE_STATIC_LIBS OFF)
    set(Boost_USE_MULTITHREADED ON)
    set(Boost_USE_STATIC_RUNTIME OFF)
    find_package(PythonLibs REQUIRED)
    include_directories(${Boost_INCLUDE_DIRS} ${EIGEN_DIR} ${PYTHON_INCLUDE_DIRS} include)
    add_library (yay SHARED src/example_ext.cpp)
    target_link_libraries(yay ${Boost_LIBRARIES} ${PYTHON_LIBRARY})
endif()