使用 Anaconda cmake 前缀查找 boost-python3

Finding boost-python3 with Anaconda cmake prefix

DLDR 如何将 cmake 指向 boost-python3 库?它不会被 cmake 自动检测到。


我正在尝试使用提供的 cmake 为 Python 3.6 构建 caffe

我的系统规格:

我用 brew 安装了 boost,例如

brew install boost boost-python3

我可以使用 find / -name libboost* 2>/dev/null 查看 boost 库。它们出现在三个目录中

  1. /usr/local/Cellar/boost/1.67.0_1/lib/
  2. /usr/local/lib/ -> 上面的符号链接
  3. boost-python3 在 /usr/local/Cellar/boost-python/1.67.0/lib/

如果我 运行 cmake -DCMAKE_PREFIX_PATH=<anaconda_env_path> -D python_version=3,我会在输出的顶部得到这个

-- Boost version: 1.67.0
-- Found the following Boost libraries:
--   system
--   thread
--   filesystem
--   chrono
--   date_time
--   atomic

但再往下,我也得到

CMake Warning at /Users/Mauceri/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1723 (message):
  No header defined for python-py365; skipping header check
Call Stack (most recent call first):
  cmake/Dependencies.cmake:157 (find_package)
  CMakeLists.txt:49 (include)


-- Could NOT find Boost
CMake Warning at /Users/Mauceri/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1723 (message):
  No header defined for python-py36; skipping header check
Call Stack (most recent call first):
  cmake/Dependencies.cmake:164 (find_package)
  CMakeLists.txt:49 (include)


-- Could NOT find Boost
CMake Warning at /Users/Mauceri/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1723 (message):
  No header defined for python-py3; skipping header check
Call Stack (most recent call first):
  cmake/Dependencies.cmake:164 (find_package)
  CMakeLists.txt:49 (include)

-- Could NOT find Boost
-- Could NOT find Boost
-- Python interface is disabled or not all required dependencies found. Building without it...

类似于Cmake doesn't find Boost,我试过添加

-DBOOST_ROOT=/usr/local/Cellar/boost/1.67.0_1/lib/ -DBoost_DEBUG=1

到 cmake 命令。在生成的输出中,以下内容使用 boost_python-py365、boost_python-py36、boost_python-py3 和 boost_python 重复三次:

[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1121 ] _boost_TEST_VERSIONS = 1.67.0;1.67;1.66.0;1.66;1.65.1;1.65.0;1.65;1.64.0;1.64;1.63.0;1.63;1.62.0;1.62;1.61.0;1.61;1.60.0;1.60;1.59.0;1.59;1.58.0;1.58;1.57.0;1.57;1.56.0;1.56;1.55.0;1.55;1.54.0;1.54;1.53.0;1.53;1.52.0;1.52;1.51.0;1.51;1.50.0;1.50;1.49.0;1.49;1.48.0;1.48;1.47.0;1.47;1.46.1;1.46.0;1.46
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1123 ] Boost_USE_MULTITHREADED = TRUE
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1125 ] Boost_USE_STATIC_LIBS = 
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1127 ] Boost_USE_STATIC_RUNTIME = 
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1129 ] Boost_ADDITIONAL_VERSIONS = 
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1131 ] Boost_NO_SYSTEM_PATHS = 
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1199 ] Declared as CMake or Environmental Variables:
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1201 ]   BOOST_ROOT = /usr/local/Cellar/boost/1.67.0_1/include/
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1203 ]   BOOST_INCLUDEDIR = 
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1205 ]   BOOST_LIBRARYDIR = 
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1207 ] _boost_TEST_VERSIONS = 1.67.0;1.67;1.66.0;1.66;1.65.1;1.65.0;1.65;1.64.0;1.64;1.63.0;1.63;1.62.0;1.62;1.61.0;1.61;1.60.0;1.60;1.59.0;1.59;1.58.0;1.58;1.57.0;1.57;1.56.0;1.56;1.55.0;1.55;1.54.0;1.54;1.53.0;1.53;1.52.0;1.52;1.51.0;1.51;1.50.0;1.50;1.49.0;1.49;1.48.0;1.48;1.47.0;1.47;1.46.1;1.46.0;1.46
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1306 ] location of version.hpp: /usr/local/Cellar/boost/1.67.0_1/include/boost/version.hpp
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1330 ] version.hpp reveals boost 1.67.0
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1416 ] guessed _boost_COMPILER = 
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1426 ] _boost_MULTITHREADED = -mt
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1502 ] _boost_RELEASE_ABI_TAG = -
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1504 ] _boost_DEBUG_ABI_TAG = -d
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1567 ] _boost_LIBRARY_SEARCH_DIRS_RELEASE = /usr/local/Cellar/boost/1.67.0_1/lib;NO_DEFAULT_PATH;NO_CMAKE_FIND_ROOT_PATH_boost_LIBRARY_SEARCH_DIRS_DEBUG   = /usr/local/Cellar/boost/1.67.0_1/lib;NO_DEFAULT_PATH;NO_CMAKE_FIND_ROOT_PATH
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1756 ] Searching for PYTHON_LIBRARY_RELEASE: boost_python-mt-1_67;boost_python-mt;boost_python
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:400 ]  Boost_LIBRARY_DIR_RELEASE = /usr/local/Cellar/boost/1.67.0_1/lib _boost_LIBRARY_SEARCH_DIRS_RELEASE = /usr/local/Cellar/boost/1.67.0_1/lib;NO_DEFAULT_PATH;NO_CMAKE_FIND_ROOT_PATH
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1809 ] Searching for PYTHON_LIBRARY_DEBUG: boost_python-mt-d-1_67;boost_python-mt-d;boost_python-mt;boost_python
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:400 ]  Boost_LIBRARY_DIR_DEBUG = /usr/local/Cellar/boost/1.67.0_1/lib _boost_LIBRARY_SEARCH_DIRS_DEBUG = /usr/local/Cellar/boost/1.67.0_1/lib;NO_DEFAULT_PATH;NO_CMAKE_FIND_ROOT_PATH
[ /Users/me/anaconda/share/cmake-3.11/Modules/FindBoost.cmake:1883 ] Boost_FOUND = 1
Could NOT find Boost
Boost version: 1.67.0
Boost include path: /usr/local/Cellar/boost/1.67.0_1/include
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.

因此,我认为缺少 boost-python 路径。我也尝试添加 -DBOOST_LIBRARYDIR,但这似乎没有任何改变。

FindBoost documentation 包含有关 boost-python

的评论

Note that Boost Python components require a Python version suffix (Boost 1.67 and later), e.g. python36 or python27 for the versions built against Python 3.6 and 2.7, respectively. This also applies to additional components using Python including mpi_python and numpy. Earlier Boost releases may use distribution-specific suffixes such as 2, 3 or 2.7. These may also be used as suffixes, but note that they are not portable.

我注意到 boost-python3 库的后缀为 37 (libboost_python37.a),所以我也尝试使用带有 python 3.7 的 anaconda 环境,但同样的错误仍然存​​在.

如何让我的 cmake 找到 boost-python3 库?

看看 boost-python 包带来了什么文件。

brew ls --verbose boost-python3

其中应该有boost-pythonXX-config.cmake个文件之类的。问题可能出在版本上。对于 find_package 使用与此文件名对应的正确包名。

在 CMake 3.12 中引入了 FindPython2 和 FindPython3。这重新设计了查找 Python 的整个处理过程,还改进了对 Anaconda 的支持。

由于您使用的是 Boost 1.67,我建议您切换到 CMake 3.12 或更新版本:

如果可能,请使用可用的最新 CMake 版本。