2016-08-09 12 views
0

boost-pythonboost-buildhomebrewとMac OS X 10.11.6でインストールしました。私はPython 3.5.2を実行しています。 boostは正しく設定され、C++プロジェクトで動作します。 user-config.jamと私のpython拡張プロジェクトディレクトリにあるjamfileはokです。私はb2インタプリタを使用して、以下のソースboost.pythonを使用して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); 
} 

から共有ライブラリをコンパイルしようとしました。これは、次のコマンドを発行します。

とクラッシュdarwin.link.dllビン/ダーウィン-4.2.1 /リリース/ hello.so

アーキテクチャx86_64のための未定義のシンボル

"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 

、バック

[...長いトレース:から参照

"typeinfoのブースト用::のpython ::オブジェクト:: py_function_impl_base"、 ...]

"ブースト::のpythonを::詳細::はinit_module(PyModuleDef &、無効(*)())"、から参照:say_hello.o LDに

_PyInit_hello:記号(S)アーキテクチャでは見つかりませんx86_64

私は非常によく似た問題に関するすべての質問を認識していますが、残念なことにそれらのどれもが有効な回答を提供していません。

私はこの単純なコードをPython拡張モジュールとして動作させるにはどうすればよいですか?

答えて

0

boost pythonライブラリとリンクする必要があります(boost.pythonはヘッダーのみではありません)。ここでは(私は私のマシン上で持っているようにパスを)後押しライブラリがビルドコマンドに含まれている方法です。

-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ライブラリなしで行うことができますと仮定します。 cmakeのについて(。私は明示的にmakeを実行していないようmake VERBOSE=1を実行したときに私が手にこのような出力)

は、ここにあなたがBoost.Pythonでプロジェクトをビルドするために使用できる簡単なCMakeLists.txtです:

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} 
) 
関連する問題