Ошибка построения расширения Python с использованием boost.python

Я установил boost так же как boost-python, а также boost-build с помощью homebrew на моем Mac с OS X 10.11.6. Я использую Python 3.5.2. boost настроен правильно и работает в проектах C ++. И то и другое, user-config.jam и jamfile, расположенный в моем каталоге проекта расширения Python, в порядке. Я попытался скомпилировать общую библиотеку из следующего источника

#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:

«typeinfo для boost :: python :: objects :: py_function_impl_base», на который ссылаются из:

[… длинный след назад …]

«Повышение :: питона :: подробнее :: init_module (PyModuleDef&, void (*) ()) «, ссылка с:

_PyInit_hello в say_hello.o ld: символы не найдены для архитектуры x86_64

Мне хорошо известны все вопросы, касающиеся подобных проблем, но, к сожалению, ни один из них не дает рабочего ответа.

Что мне нужно сделать, чтобы этот простой код работал как модуль расширения Python?

0

Решение

Вы также должны связать его с библиотекой Boost Python (так как Boost.python не только заголовок). Вот как библиотеки boost включены в команду build (пути, которые у меня есть на моей машине):

-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}
)
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]