Cmake 找不到 boost_python

问题描述 投票:0回答:3

我正在尝试在我的 MacOS High Sierra 上通过此链接构建这个简单的 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.

我在这里缺少什么?

python c++ boost-python
3个回答
10
投票

来自本文档

请注意,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)

3
投票

要将正确的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
boost模块。


0
投票

基于@David Faure 的答案,我有以下更简单的方法:

find_package(Python3 REQUIRED COMPONENTS Interpreter Development.Module NumPy)

find_package(Boost 1.82 REQUIRE COMPONENTS 
             python${Python_VERSION_MAJOR}${Python_VERSION_MINOR} 
             # uses the versions found by find_package(Python3 ...) above,
             # without string parsing silliness

用于查找 Python3CMake 文档帮助我了解了如何使用变量

Python_VERSION_MAJOR
Python_VERSION_MINOR

© www.soinside.com 2019 - 2024. All rights reserved.