CMake 找不到 PythonLibs。

我正在尝试在我的运行在VirtualBox模拟器上的Ubuntu系统上构建inria Graphite。我按照说明进行操作,并安装了python-dev软件包,但是当我运行cmake时,仍然出现错误。
CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:108          (message):
Could NOT find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)
(Required is at least version "3.2")
Call Stack (most recent call first):
 /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:315     (_FPHSA_FAILURE_MESSAGE)
 /usr/share/cmake-2.8/Modules/FindPythonLibs.cmake:208 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
 src/packages/OGF/gel_python3/CMakeLists.txt:11 (FIND_PACKAGE)

我检查了/usr/lib/并找到了。
tintin@tintin-VirtualBox:/usr/lib$ find . -name "libpython*"
./x86_64-linux-gnu/libpython3.4m.so.1.0
./x86_64-linux-gnu/libpython2.7.so.1.0
./x86_64-linux-gnu/libpython3.4m.a
./x86_64-linux-gnu/libpython2.7.a
./x86_64-linux-gnu/libpython3.4m.so
./x86_64-linux-gnu/libpython2.7.so
./x86_64-linux-gnu/libpython2.7.so.1
./x86_64-linux-gnu/libpython3.4m.so.1

所以为什么CMake找不到PythonLibs,或者我应该如何处理这个问题?
4个回答


2请不要直接指向外部链接,而是将相关部分复制粘贴到这里。这样,即使由于某种原因无法访问链接,内容仍然可以在这里找到。 - heemayl
1好的,解决方案是运行:sudo apt-get install python-dev - helgar
@helgar 请编辑您的答案并添加上述命令。 - Ron
4一个小提示:对于Python 3,请使用apt-get install python3-devpython-devpython3-dev是元包,它们会拉取所选Python版本的最新开发上游。 - rbaleksandar
这并不能解决所有情况下的问题,@Job给出的答案解释了原因。 - minerals
@minerals 乔布给出了什么回答? - KansaiRobot
Caffe目前只支持2.7版本,并且无法与python3一起使用。如果你尝试安装python3-dev,它会安装python-is-python3,但是Caffe仍然会报错`Could NOT find PythonLibs (Required is at least version "2.7")'。为了让Caffe的cmake正常工作,你需要先安装python-is-python2并回退,然后再安装python-dev(版本2)。 - DragonLord

问题似乎是Ubuntu 14.04默认安装Python 3.4,而Ubuntu的CMake版本(2.8)只搜索到Python 3.3。一个解决方法是在find_package语句之前添加set(Python_ADDITIONAL_VERSIONS 3.4)。请注意,我已经提交了一个关于这个问题的bug
自从CMake 3.0以后,CMake可以搜索到Python 3.4,所以手动安装那个版本也可以解决问题。

1很好解释一下为什么要投反对票。 - mtvec

对我来说,问题是一个糟糕的缓存。

rm CMakeCache.txt

删除了旧的2.7版本缓存,并允许它在我的情况下找到3.2。

我使用的cmake是

find_package(PythonInterp 3.2 REQUIRED)
find_package(PythonLibs 3.2 REQUIRED)
message(STATUS "PYTHON_LIBRARIES = ${PYTHON_LIBRARIES}")
message(STATUS "PYTHON_EXECUTABLE = ${PYTHON_EXECUTABLE}")
message(STATUS "PYTHON_INCLUDE_DIRS = ${PYTHON_INCLUDE_DIRS}")
...
include_directories(${PYTHON_INCLUDE_DIRS})

最近我遇到了一个类似的问题,使用 Ubuntu 14.04 64 位系统;显然,默认情况下 CMake 不会查找依赖于体系结构的安装文件夹:

CMake constructs a set of possible installation prefixes for the package. Under
each prefix several directories are searched for a configuration file. The tables
below show the directories searched.

[...]

  <prefix>/(lib/<arch>|lib|share)/cmake/<name>*/          (U)
  <prefix>/(lib/<arch>|lib|share)/<name>*/                (U)
  <prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/  (U)

[...]

In all cases the <name> is treated as case-insensitive and corresponds to any of
the names specified (<package> or names given by NAMES). Paths with lib/<arch>
are enabled if CMAKE_LIBRARY_ARCHITECTURE is set.

(来自CMake 2.8.12在线文档的find_package命令
解决方案是在项目根目录的CMakeLists.txt文件中设置CMAKE_LIBRARY_ARCHITECTURE(在您的情况下,这将是编辑src/packages/OGF/gel_python3/CMakeLists.txt),然后调用find_package for PythonLibs;例如:
cmake_minimum_required(VERSION 2.8)
project(project_name)

# Check the architecture and set CMAKE_LIBRARY_ARCHITECTURE accordingly
if(UNIX)
  if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu")
  endif()
endif()

find_package(PythonInterp 3.2 REQUIRED)
find_package(PythonLibs 3.2 REQUIRED)

# Rest of your file

在我的情况下,那个方法有效。