我使用操作系统X 10.11.6在我的Mac上使用boost
安装了boost-python
以及boost-build
和homebrew
。我正在运行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扩展模块工作?
答案 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}
)