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/issues/484

helgar
источник
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 / packages / 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

Это сработало в моем случае.

Бертран Моро
источник