CMake ne peut pas trouver PythonLibs

14

J'essaie de construire inria Graphite sur mon ubuntu qui s'exécute dans un simulateur VirtualBox, je suis les instructions et j'installe les python-devpackages, mais quand je lance cmake, j'ai toujours une erreur:

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)

J'ai vérifié /usr/lib/et trouvé

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

alors pourquoi cmake ne peut pas trouver les PythonLibs, ou comment dois-je gérer cela?

tintin
la source

Réponses:

21

L'installation python-deva corrigé cela pour moi:

sudo apt-get install python-dev

Vous avez l'astuce ici: https://github.com/Valloric/YouCompleteMe/issues/484

Helgar
la source
2
Plutôt que de pointer vers un lien externe, veuillez copier-coller la partie pertinente à partir de là afin que si le lien est inaccessible pour une raison quelconque, le contenu est toujours disponible ici ..
heemayl
1
Eh bien, la solution est d'exécuter:sudo apt-get install python-dev
helgar
@helgar Veuillez modifier votre réponse et ajouter la commande ci-dessus.
Ron
3
Une petite note: pour l'utilisation de Python 3 apt-get install python3-dev. python-devet python3-devsont des métapaquets qui tirent le développement le plus récent en amont pour le Python sélectionné.
rbaleksandar
Cela ne résout pas le problème dans tous les cas, la réponse donnée par @Job explique pourquoi.
minéraux
10

Le problème semble être qu'Ubuntu 14.04 installe Python 3.4 par défaut et que la version CMake d'Ubuntu (2.8) ne recherche que jusqu'à Python 3.3. Une solution de contournement consiste à ajouter set(Python_ADDITIONAL_VERSIONS 3.4)avant l' find_packageinstruction. Notez que j'ai déposé un bogue à propos de ce problème.

Depuis CMake 3.0, CMake recherche jusqu'à Python 3.4 , donc l'installation manuelle de cette version devrait également résoudre le problème.

Emploi
la source
Ce serait bien de donner une explication sur le downvote.
Job
3

Pour moi, le problème était un mauvais cache

rm CMakeCache.txt

Supprimé le cache avec l'ancienne version 2.7 et lui a permis de trouver 3.2 dans mon cas.

Le cmake que j'ai utilisé est

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})
Dirk Bester
la source
1

J'ai récemment eu un problème similaire avec Ubuntu 14.04 64 bits; apparemment, CMake ne regarde pas par défaut les dossiers d'installation dépendants de l'architecture:

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.

(à partir de la documentation en ligne de CMake 2.8.12 de la commande find_package )

Une solution consiste à définir cette CMAKE_LIBRARY_ARCHITECTURE dans le fichier racine du projet CMakeLists.txt (dans votre cas, ce serait éditer src / packages / OGF / gel_python3 / CMakeLists.txt) avant d'appeler find_package pour PythonLibs; par exemple:

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

Cela a fonctionné dans mon cas.

Bertrand Moreau
la source