【问题标题】:Cmake is not able to find Python-librariesCmake 无法找到 Python 库
【发布时间】:2014-08-02 04:30:17
【问题描述】:

收到此错误:

sudo: unable to resolve host coderw@ll
-- Could NOT find PythonLibs (missing:  PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS) 
CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:108     
(message):
Could NOT find PythonInterp (missing: PYTHON_EXECUTABLE)
Call Stack (most recent call first):
/usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:315  
(_FPHSA_FAILURE_MESSAGE)
/usr/share/cmake-2.8/Modules/FindPythonInterp.cmake:139 
(FIND_PACKAGE_HANDLE_STANDARD_ARGS)
Code/cmake/Modules/FindNumPy.cmake:10 (find_package)
CMakeLists.txt:114 (find_package)



-- Configuring incomplete, errors occurred!
See also "/home/coderwall/Desktop/rdkit/build/CMakeFiles/CMakeOutput.log".
See also "/home/coderwall/Desktop/rdkit/build/CMakeFiles/CMakeError.log".

我已经安装了:

  1. sudo apt-get install python-dev
  2. 环境变量已经设置如下:

    PYTHON_INCLUDE_DIRS=/usr/include/python2.7 
    PYTHON_LIBRARIES=/usr/lib/python2.7/config/libpython2.7.so
    

python.h 的位置:/usr/lib/include/python2.7/python.h

python 库的位置:/usr/lib/python2.7/ 如何解决这个问题?

【问题讨论】:

  • 嗯,试试设置PYTHON_EXECUTABLE=...?
  • 尝试并识别但仍然:Could NOT find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)
  • 能否将 rdkit 根 CMakeLists.txt 文件的代码包含在您的问题中?这可能会有所帮助。

标签: python python-2.7 cmake


【解决方案1】:

您可以通过在cmake 命令后面附加由相应文件夹填充的-DPYTHON_LIBRARY-DPYTHON_INCLUDE_DIR 标志来修复错误。

因此,诀窍是用 python 解释器返回的信息填充这些参数,这是最可靠的。这可能独立于您的 python 位置/版本(也适用于 Anaconda 用户):

$ cmake .. \
-DPYTHON_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())")  \
-DPYTHON_LIBRARY=$(python -c "import distutils.sysconfig as sysconfig; print(sysconfig.get_config_var('LIBDIR'))")

如果您要链接到 cmake 的 python 版本是 Python3.X,并且默认 python 符号链接指向 Python2.X,则可以使用 python3 -c ... 代替 python -c ...

如果错误仍然存​​在,您可能需要将cmake 更新为@pdpcosta 所述的更高版本,然后再次重复该过程。

【讨论】:

  • print(sysconfig.get_config_var('LIBDIR'))" 打印 /opt/conda/lib,但随后我收到警告:目标“某事”请求链接到目录“/opt/conda/ lib"。目标可能仅链接到库。CMake 正在删除该项目。-我们是否需要为 -DPYTHON_LIBRARY 提供 .so libpython 的路径?
  • @Mr.WorshipMe 是的,我更改了命令以提供 .so 的路径,如下所示:-DPYTHON_LIBRARY=$(python -c "import distutils.sysconfig as sysconfig; import os; print(os.path.join(sysconfig.get_config_var('LIBDIR'), sysconfig.get_config_var('LDLIBRARY')))")
  • 特别是对于 anaconda,这对我有用(并且希望更容易概括):github.com/jkhoogland/FindPythonAnaconda(尽管我必须做两个小改动——如果上游,它们都在我的 GitHub 分支中也不适合你)
  • 这是最好的答案,因为它会自动适应当前的 python (which python) 并且在 conda env 处于活动状态时无缝工作。
  • 注意(我希望它可以帮助 M1 Mac 用户使用 Cmake 和 Python 3):就我而言,为了解决我的特定问题,我需要做 DPYTHON3_LIBRARYDPYTHON3_INCLUDE_DIR。没有 3 就不行。
【解决方案2】:

这对我很有帮助:

# if using python2
apt-get install python-dev

# if using python3
apt-get install python3-dev

【讨论】:

  • 对我来说(在 Centos7 上)这条线解决了这个问题:yum install python34-devel
  • 这对我有用,没有其他答案建议的任何 cmake 参数(-DPYTHON_LIBRARY 等)。我有python-dev,但忘记了python3-dev
  • 非常糟糕的答案。就像,如果它不起作用,请尝试安装所有内容。您需要的是 python2 或 python3...(现在在 2020 年,最好更新您的答案,因为不推荐使用 python2)
  • 这应该被标记为正确答案。
  • 这解决了我的问题。
【解决方案3】:

我遇到了同样的问题,发现错误消息给出了误导性的变量名称。尝试设置以下内容(单数而不是复数):

PYTHON_INCLUDE_DIR=/usr/include/python2.7 
PYTHON_LIBRARY=/usr/lib/python2.7/config/libpython2.7.so

您看到错误消息的(复数)变量是 PythonLibs 在正确初始化时设置的值。

【讨论】:

【解决方案4】:

即使按照上面的建议添加-DPYTHON_INCLUDE_DIR-DPYTHON_LIBRARY,我仍然面临Could NOT find PythonInterp 错误。解决它的方法是将-DPYTHON_EXECUTABLE:FILEPATH= 添加到cmake,正如https://github.com/pybind/pybind11/issues/99#issuecomment-182071479 中所建议的那样:

cmake .. \
-DPYTHON_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())")  \
-DPYTHON_LIBRARY=$(python -c "import distutils.sysconfig as sysconfig; print(sysconfig.get_config_var('LIBDIR'))") \
-DPYTHON_EXECUTABLE:FILEPATH=`which python`

【讨论】:

  • 谢谢!我还发现了 github 页面,但我只设置了 PYTHON_EXECUTABLE:FILEPATH 并且没有用。当我尝试在 MacOSX (Mojave) 上构建 OpenVDB 时,您的解决方案解决了我的问题。
  • 非常感谢,我找不到libpython-x.so,手动编译安装opencv-python失败,这样解决了我的问题
【解决方案5】:

我在尝试在 Xubuntu 14.04 Thrusty Tahr 系统上编译 OpenCV 3 时遇到了这个问题。 安装完 Python 的所有开发包后,配置过程总是返回消息:

Could NOT found PythonInterp: /usr/bin/python2.7 (found suitable version "2.7.6", minimum required is "2.7")
Could NOT find PythonLibs (missing: PYTHON_INCLUDE_DIRS) (found suitable exact version "2.7.6")
Found PythonInterp: /usr/bin/python3.4 (found suitable version "3.4", minimum required is "3.4")
Could NOT find PythonLibs (missing: PYTHON_LIBRARIES) (Required is exact version "3.4.0")

Thrusty Tahr 存储库上可用的 CMake 版本是 2.8。 一些帖子启发我升级 CMake。 我添加了一个安装 CMake 3.2 版的 PPA CMake 存储库。

升级后一切顺利,编译成功。

【讨论】:

  • 别忘了先清理所有cmake缓存!
  • @acgtyrant 你是怎么做到的? cmake 干净吗?
【解决方案6】:

一些最新版本的 Ubuntu 默认安装 Python 3.4,而来自 Ubuntu (2.8) 的 CMake 版本仅搜索到 Python 3.3。

尝试在find_package 语句之前添加set(Python_ADDITIONAL_VERSIONS 3.4)

记得清理CMakeCache.txt

【讨论】:

  • 这是我的 14.04 Ubuntu 系统的问题。我通过安装更新​​的 cmake 版本来修复它(askubuntu.com/a/945589/187411
  • 我通过Remember to clean CMakeCache.txt too. 解决了这个问题,非常感谢Patrizio。在 mbec-cli2 CMake 中(未找到 jinja2、intelhex、prettytable)。
【解决方案7】:

此问题也可能发生在 Windows 中。 Cmake 查看注册表,有时未设置 python 值。对于有类似问题的人:

http://ericsilva.org/2012/10/11/restoring-your-python-registry-in-windows/

只需创建一个 .reg 文件来设置必要的密钥并进行相应的编辑以匹配您的设置。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Python]

[HKEY_CURRENT_USER\Software\Python\Pythoncore]

[HKEY_CURRENT_USER\Software\Python\Pythoncore\2.6]

[HKEY_CURRENT_USER\Software\Python\Pythoncore\2.6\InstallPath]
@="C:\\python26"

[HKEY_CURRENT_USER\Software\Python\Pythoncore\2.6\PythonPath]
@="C:\\python26;C:\\python26\\Lib\\;C:\\python26\\DLLs\\"

[HKEY_CURRENT_USER\Software\Python\Pythoncore\2.7]

[HKEY_CURRENT_USER\Software\Python\Pythoncore\2.7\InstallPath]
@="C:\\python27"

[HKEY_CURRENT_USER\Software\Python\Pythoncore\2.7\PythonPath]
@="C:\\python27;C:\\python27\\Lib\\;C:\\python27\\DLLs\\"

【讨论】:

  • 如果我同时安装了 32 位和 64 位版本并且想要构建 32 位和 64 位 C++ 二进制文件,这是否也有效?
【解决方案8】:

请注意,如果您使用的是 cMake 3.12 或更高版本,则变量 PythonInterpPythonLibs 已更改为 Python

所以我们使用:

find_package(Python ${PY_VERSION} REQUIRED)

代替:

find_package(PythonInterp ${PY_VERSION} REQUIRED) find_package(PythonLibs ${PY_VERSION} REQUIRED)

详情请参阅https://cmake.org/cmake/help/v3.12/module/FindPython.html

【讨论】:

    【解决方案9】:

    将此粘贴​​到您的 CMakeLists.txt 中:

    # find python
    execute_process(COMMAND python-config --prefix OUTPUT_VARIABLE PYTHON_SEARCH_PATH)
    string(REGEX REPLACE "\n$" "" PYTHON_SEARCH_PATH "${PYTHON_SEARCH_PATH}")
    file(GLOB_RECURSE PYTHON_DY_LIBS ${PYTHON_SEARCH_PATH}/lib/libpython*.dylib ${PYTHON_SEARCH_PATH}/lib/libpython*.so)
    if (PYTHON_DY_LIBS)
        list(GET PYTHON_DY_LIBS 0 PYTHON_LIBRARY)
        message("-- Find shared libpython: ${PYTHON_LIBRARY}")
    else()
        message(WARNING "Cannot find shared libpython, try find_package")
    endif()
    
    find_package(PythonInterp)
    find_package(PythonLibs ${PYTHON_VERSION_STRING} EXACT)
    

    【讨论】:

      【解决方案10】:

      如果这可能有帮助,我发现了一个类似问题的解决方法,查看 cmake 文档: https://cmake.org/cmake/help/v3.0/module/FindPythonLibs.html

      您必须为 cmake 设置两个环境变量才能找到一致的版本。 不幸的是,这不是一个通用的解决方案......

      cmake -DPYTHON_LIBRARY=${HOME}/.pyenv/versions/3.8.0/lib/libpython3.8.a -DPYTHON_INCLUDE_DIR=${HOME}/.pyenv/versions/3.8.0/include/python3.8/ cern_root/
      

      【讨论】:

        【解决方案11】:

        我已在我的系统上升级到 python3.8 并且安装不完整。设法通过安装其余的 3.8 包来修复它:

        sudo apt-get install python3.8 python3.8-dev python3.8-distutils python3.8-venv
        

        【讨论】:

          【解决方案12】:

          如果以上所有方法都不起作用,也许下面的命令行对你有用。

          sudo apt-get install cython cython3

          【讨论】: