CMake не може знайти PythonLibs


14

Я намагаюся побудувати inria Graphite на своєму ubuntu, який працює в симуляторі VirtualBox, я виконую інструкції та встановлюю 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, або як я маю справу з цим?

Відповіді:


21

Встановлення python-devфактично виправлено це для мене:

sudo apt-get install python-dev

Отримайте підказку тут: https://github.com/Valloric/YouCompleteMe/isissue/484


2
Замість того, щоб вказувати на зовнішнє посилання, скопіюйте, скопіюйте звідти відповідну частину, щоб, якщо посилання з якоїсь причини недосяжно, вміст все ще доступний тут ..
heemayl

1
Ну, рішення - запустити:sudo apt-get install python-dev
helgar

@helgar Будь ласка, відредагуйте свою відповідь та додайте вищевказану команду.
Рон

3
Невелика примітка: для використання Python 3 apt-get install python3-dev. python-devі python3-devє метапакетами, які тягнуть найбільш поточний розробник вгору за поточним вибраним Python.
rbaleksandar

Це не вирішує питання у всіх випадках, відповідь, яку дає @Job, пояснює, чому.
корисні копалини

10

Здається, проблема полягає в тому, що Ubuntu 14.04 за замовчуванням встановлює Python 3.4, а версія CMake з Ubuntu (2.8) здійснює пошук лише до Python 3.3. Обхід полягає в тому, щоб додати set(Python_ADDITIONAL_VERSIONS 3.4)до find_packageзаяви. Зауважте, що я подав помилку щодо цієї проблеми.

Оскільки CMake 3.0, CMake здійснює пошук до Python 3.4 , тому встановлення цієї версії вручну також має вирішити проблему.


Було б непогано дати пояснення щодо голосування.
робота

3

Для мене питання був поганим кешем

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

1

Нещодавно у мене була подібна проблема з 64-розрядною версією Ubuntu 14.04; Мабуть, 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 )

Рішення полягає у встановленні цього CMAKE_LIBRARY_ARCHITECTURE у кореневому файлі проекту CMakeLists.txt (у вашому випадку, який би редагував src / пакети / OGF / gel_python3 / CMakeLists.txt) перед тим, як викликати find_package для 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

Це спрацювало в моєму випадку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.