CMake kann PythonLibs nicht finden


13

Ich versuche, inria Graphite auf meinem Ubuntu zu erstellen, das in einem VirtualBox-Simulator ausgeführt wird. Befolgen Sie die Anweisungen und installieren Sie die python-devPakete. Wenn ich cmake ausführe, wird dennoch ein Fehler angezeigt:

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)

Ich habe nachgesehen /usr/lib/und gefunden

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

Warum kann cmake die PythonLibs nicht finden, oder wie soll ich damit umgehen?

Antworten:


21

Die Installation hat python-devdas für mich behoben:

sudo apt-get install python-dev

Habe den Hinweis hier: https://github.com/Valloric/YouCompleteMe/issues/484


2
Anstatt auf einen externen Link zu verweisen, kopieren Sie bitte den entsprechenden Abschnitt von dort und fügen Sie ihn ein, damit der Inhalt auch dann noch hier verfügbar ist, wenn der Link aus irgendeinem Grund nicht erreichbar ist.
heemayl 26.06.15

1
Nun, die Lösung lautet:sudo apt-get install python-dev
helgar

@helgar Bitte bearbeite deine Antwort und füge den obigen Befehl hinzu.
Ron

3
Ein kleiner Hinweis: für Python 3 verwenden apt-get install python3-dev. python-devund python3-devsind Metapakete, die den aktuellsten Entwickler für das ausgewählte Python in den Upstream ziehen.
rbaleksandar

Dies löst das Problem nicht in allen Fällen. Die Antwort von @Job erklärt, warum.
Mineralien

10

Das Problem scheint zu sein, dass Ubuntu 14.04 standardmäßig Python 3.4 installiert und die CMake-Version von Ubuntu (2.8) nur bis Python 3.3 sucht. Eine Problemumgehung ist das Hinzufügen set(Python_ADDITIONAL_VERSIONS 3.4)vor der find_packageAnweisung. Beachten Sie, dass ich einen Fehler zu diesem Problem gemeldet habe.

Seit CMake 3.0 sucht CMake nach Python 3.4 , daher sollte auch die manuelle Installation dieser Version das Problem beheben.


Es wäre schön, eine Erklärung zu der Ablehnung abzugeben.
Job

2

Für mich war das Problem ein schlechter Cache

rm CMakeCache.txt

Entfernte den Cache mit der alten 2.7-Version und erlaubte es, 3.2 in meinem Fall zu finden.

Der cmake, den ich benutzt habe, ist

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})

1

Ich hatte kürzlich ein ähnliches Problem mit Ubuntu 14.04 64-Bit; Anscheinend untersucht CMake standardmäßig keine architekturabhängigen Installationsordner:

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.

(ab CMake 2.8.12 Online-Dokumentation des Befehls find_package )

Eine Lösung besteht darin, diese CMAKE_LIBRARY_ARCHITECTURE in der Projektstammdatei CMakeLists.txt festzulegen (in Ihrem Fall würde dies src / packages / OGF / gel_python3 / CMakeLists.txt bearbeiten), bevor find_package für PythonLibs aufgerufen wird. zum Beispiel:

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

Das hat in meinem Fall funktioniert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.