使用boost.python构建Python扩展时出错

时间:2016-08-09 15:33:24

标签: c++ python-3.5 boost-python

我使用操作系统X 10.11.6在我的Mac上使用boost安装了boost-python以及boost-buildhomebrew。我正在运行Python 3.5.2。 boost已正确设置并适用于C ++项目。 user-config.jam和位于我的python扩展项目目录中的jamfile都可以。我尝试从以下源代码编译共享库

#include <iostream>
#include <boost/python.hpp>

using namespace std;


void say_hello() {
    std::cout << "HELLO!!!!!";
}

BOOST_PYTHON_MODULE(hello) {
    using namespace boost::python;
    def ("say_hello", say_hello);
}

使用b2解释器。它发出以下命令:

"g++" -dynamiclib -Wl,-single_module -install_name "hello.so" -L"/usr/local/lib/python3.5" -o "bin/darwin-4.2.1/release/hello.so" "bin/darwin-4.2.1/release/say_hello.o"  -lpython3.5    -headerpad_max_install_names -Wl,-dead_strip -no_dead_strip_inits_and_terms

,与

崩溃
  

darwin.link.dll bin / darwin-4.2.1 / release / hello.so

     

架构x86_64的未定义符号:

     

&#34;用于boost :: python :: objects :: py_function_impl_base&#34;的typeinfo,引自:

     

[......追溯......]

     

&#34; boost :: python :: detail :: init_module(PyModuleDef&amp;,void(*)())&#34;,引自:

     say_hello.o中的

_PyInit_hello ld:找不到架构x86_64的符号

我非常清楚有关类似问题的所有问题,但不幸的是,它们都没有提供可行的答案。

我需要做什么才能让这个简单的代码作为Python扩展模块工作?

1 个答案:

答案 0 :(得分:0)

你也应该将它与boost python库链接起来(因为boost.python不是头文件)。以下是构建命令中包含的boost库(我在机器上的路径):

-L/usr/lib/libpython2.7.dylib /usr/local/lib/libboost_system-mt.dylib /usr/local/lib/libboost_python-mt.dylib /usr/lib/libpython2.7.dylib -Wl,-rpath,/usr/lib/libpython2.7.dylib

我假设您可以不使用libboost_system库。 (运行make VERBOSE=1时得到的输出,因为我没有明确地运行make。)

关于cmake,这里有一个简单的CMakeLists.txt,您可以使用Boost.Python来构建项目:

cmake_minimum_required(VERSION 2.8)

set(LIBRARY_NAME "ext") # ext for extension

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -ggdb")

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/build)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib)

set(SOURCES
    python_interface.cpp
    main.cpp
)

set(CMAKE_MACOSX_RPATH ON)

# Get Boost
find_package(Boost COMPONENTS
    system
    python REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

# Get Python
find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
link_directories(${PYTHON_LIBRARIES})

add_library(${LIBRARY_NAME} SHARED ${SOURCES})

target_link_libraries(${LIBRARY_NAME} 
    ${Boost_LIBRARIES}
    ${PYTHON_LIBRARIES}
)