我正在尝试从Mac OS High Sierra上的this link构建这个简单的boost python演示。
以下是hello_ext.cpp
:
#include <boost/python.hpp>
char const* greet()
{
return "hello, world";
}
BOOST_PYTHON_MODULE(hello_ext)
{
using namespace boost::python;
def("greet", greet);
}
以下是CmakeLists.txt
:
cmake_minimum_required(VERSION 3.5)
# Find python and Boost - both are required dependencies
find_package(PythonLibs 2.7 REQUIRED)
find_package(Boost COMPONENTS python REQUIRED)
# Without this, any build libraries automatically have names "lib{x}.so"
set(CMAKE_SHARED_MODULE_PREFIX "")
# Add a shared module - modules are intended to be imported at runtime.
# - This is where you add the source files
add_library(hello_ext MODULE hello_ext.cpp)
# Set up the libraries and header search paths for this target
target_link_libraries(hello_ext ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})
target_include_directories(hello_ext PRIVATE ${PYTHON_INCLUDE_DIRS})
我认为我需要安装python。 Boost 1.69已经安装好了,我做了brew install boost-python
,工作正常。进行brew list | grep 'boost'
会列出boost
和boost-python
。
但是,从cmake ..
目录执行build
时会抱怨以下问题:
Could not find the following Boost libraries:
boost_python
No Boost libraries were found. You may need to set BOOST_LIBRARYDIR to
the directory containing Boost libraries or BOOST_ROOT to the location
of Boost.
我在这里想念什么?
答案 0 :(得分:2)
请注意,Boost Python组件需要Python版本后缀(Boost 1.67及更高版本),例如python36或python27分别针对针对Python 3.6和2.7构建的版本。这也适用于使用Python的其他组件,包括mpi_python和numpy。早期的Boost版本可能使用特定于发行版的后缀,例如2、3或2.7。这些也可以用作后缀,但请注意,它们不是可移植的。
您发现的示例可能是使用旧版本的Boost。因此,您可能需要更改以下行:
find_package(Boost COMPONENTS python27 REQUIRED)
答案 1 :(得分:1)
要将正确的python版本传递给find_package(Boost)
,我建议从系统上找到的python版本中提取它。
find_package(PythonLibs 3.6 REQUIRED)
# Extract major/minor python version
string(REPLACE "." ";" VERSION_LIST ${PYTHONLIBS_VERSION_STRING})
list(GET VERSION_LIST 0 PYTHONLIBS_VERSION_MAJOR)
list(GET VERSION_LIST 1 PYTHONLIBS_VERSION_MINOR)
find_package(Boost COMPONENTS python${PYTHONLIBS_VERSION_MAJOR}${PYTHONLIBS_VERSION_MINOR} REQUIRED)
第一行的3.6是最低版本,由于python38
,它在我的机器上找到了/usr/lib64/libpython3.8.so
升压模块。