Не работает find package

Find_package не работает с библиотекой из источника

У меня есть библиотека, которую я установил из источника.
Выглядит нормально, манифест установки показывает, что все нужные мне файлы были установлены:

Я также могу включить заголовки, которые мне нужны из этой библиотеки, в мой проект; они найдены.

Что не работает, так это связывание библиотеки.
мой cmakeLists имеет следующую строку:

Я думаю, этого будет достаточно, так как файл Findaruco.cmake находится в
/ USR / местные / Библиотека / CMake. Однако cmake не может найти библиотеку.
Я также заметил, что
locate .so | grep aruco на самом деле не найти библиотеку. Это вывод:

Так что что-то явно не так.
Я также заметил, что при установке cmake сообщает мне следующее (наряду с другими из этой библиотеки):

Это как-то связано с этим?
Если вам нужно взглянуть на библиотеку, вы можете найти ее здесь на sourceforge .
Я не могу построить без него, как мне заставить это работать?

Решение

так модули cmake ищутся по конкретным путям. Я считаю, что по умолчанию что-то вроде /usr/share/cmake/ /modules

вы можете установить переменную cmake_module_path в каталог, в который вы установили файл cmake Findaruco, или переместить этот модуль в то место, где находятся другие ваши файлы cmake.

примечание: если вы еще не бежали $ sudo updatedb затем $ locate не покажет новые библиотеки, которые вы установили, потому что они не были добавлены в базу данных для поиска

Источник

Подключение пакетов CMAKE с использованием FIND_PACKAGE

Возможно тема вопроса старая, и множество ответов на нее есть. В общем, при компилировании проектов с github при попытке установки все происходит успешно, файл поиска библиотеки копируется в папку

Но, при попытке подключения пакета через FIND_PACKAGE , cmake всегда говорит что не может найти файл поиска библиотеки, при том что если пакеты устанавливать из терминала, ту же библиотеку libvlc-dev , libvlccore-dev или любую другую, cmake никогда не найдет пакеты через FIND_PACKAGE .

В чем может быть проблема с поиском библиотек? Уже устал вручную прописывать пути к библиотекам и их заголовочным файлам.

Для поиска SDL2 использую полукостыль такого вида:

Вот один из проектов/враппер над SDL2 : libSDL2pp

Вывод make && make install :

3 ответа 3

Тут видимо проблема в неправильном режиме использования макроса find_package . По-умолчанию он работает в режиме Module и игнорирует модули установленные через install. Соответственно тут имеет смысл использовать его в режиме Config использовав одноименную волшебную директиву:

В никсах cmake ищет заголовки и библиотеки с помощью pkgcong, который, собственно, и рапортует о провале поиска. В случае, если Вы видите в выдаче cmake

то определенно помогает установка переменной среды PKG_CONFIG_PATH, где располагаются .pk файлы ваших пакетов. Например, при сборке edb cmake не находит пакета gdtoa-desktop, если тот установлен в /usr/local. Если же сказать

то cmake отрабатывает без ошибок и пердуперждений.

файл поиска библиотеки копируется в папку

Сразу две ошибки:

  1. Никогда не устанавливайте модуль в папку Modules самого CMake. Эта директория только для родных модулей CMake.
  2. При установке библиотеки XXX должен устанавливаться не файл FindXXX.cmake , подходящий для MODULE режима find_package, а файл XXXConfig.cmake (или xxx-config.cmake ), подходящий для CONFIG режима.

Разница между скриптами «Find» и «Config» в том, что:

  1. «Find» скрипт ищет библиотеку, так как не знает, где она установлена. Не знает потому, что этот скрипт поставляется отдельно от библиотеки.
  2. «Config» скрипт ничего не ищет: он точно знает, где библиотека установлена.
    А всё потому, что этот скрипт собирается и устанавливается вместе с библиотекой.

CMake предоставляет команду install(EXPORT) , которая сама создаёт «Config» скрипт для устанавливаемых таргетов (target). Более подробно про эти скрипты можно почитать в документации.

Источник

Как работает команда find_package() в cmake

Скажите, пожалуйста, как в cmake работает команда find_package() ?

Мне не удалось найти исчерпывающего объяснения и понятных примеров, даже в официальной документации.

Например, если в проекте cmake вызывается команда find_package() , достаточно ли мне (на Linux ) установить нужный пакет в систему? Или же мне нужно каким-то образом прицепить нужный пакет к проекту до вызова find_package() ?

1 ответ 1

Если не вдаваться в детали, то find_package(Package) просто ищет специальный cmake-файл, устанавливает несколько переменных и исполняет его аналогично include . Сей файл:

  • В «классическом» Module -варианте называется именем вида FindPackage.cmake . Набор таких файлов распространяется вместе с самим cmake (на *nix системах обычно лежат где-то в /usr/share/cmake/Modules ), а также может быть в дистрибутиве собираемого проекта (в типовом варианте для этого CMAKE_MODULE_PATH присваивается каталог с оным).
  • В Config -варианте такой файл называется PackageConfig.cmake , или package-config.cmake и ищется в одном из местоположений, описанных в документации.

Строго говоря, от самого файла не требуется делать что-то конкретное или устанавливать какие-либо переменные. Единственное — в случае если пакет «найден», то он должен установить Package_FOUND в истинное значение.

Все прочие действия и переменные остаются на усмотрение авторов конкретных модулей. За подробностями стоит обращаться к их документации или самим скриптам. Обычно устанавливаются:

  • Package_VERSION
  • Package_INCLUDE_DIRECTORIES
  • Package_LIBRARIES

Обычно эти переменные являются кешированными (см. CACHE ), так что по мере необходимости их можно переопределить из командной строки.

Например, если в проекте cmake вызывается команда find_package() , достаточно ли мне (на Linux ) установить нужный пакет в систему? Или же мне нужно каким-то образом прицепить нужный пакет к проекту до вызова find_package() ?

Обычно этого достаточно, подразумевая, что при этом также устанавливаются пакеты с заголовочными файлами и прочей мишурой для разработчиков ( *-dev или *-devel пакеты).

Но т.к. всё это делается простым скриптом, то иногда он может не находить некоторые файлы т.к., например, они установлены в неожиданное для его автора место. В таких случаях обычно достаточно установить несколько входных и/или выходных переменных при запуске cmake , например, передав ему что-то вроде -DPackage_INCLUDE_DIR=/usr/include/package . Но конкретные значение крайне зависят от конкретных же модулей. Зачастую, когда возникают подобные ошибки, приходится обращаться к коду самих скриптов поиска, чтобы понять, где же их надо погладить.

Источник

What use is find_package() when you need to specify CMAKE_MODULE_PATH?

I’m trying to get a cross-plattform build system working using CMake. Now the software has a few dependencies. I compiled them myself and installed them on my system.

Some example files which got installed:

Now CMake has a find_package() which opens a Find*.cmake file and searches after the library on the system and defines some variables like SomeLib_FOUND etc.

My CMakeLists.txt contains something like this:

The first command defines where CMake searches after the Find*.cmake and I added the directory of SomeLib where the FindSomeLib.cmake can be found, so find_package() works as expected.

But this is kind of weird because one of the reasons why find_package() exists is to get away from non-cross-plattform hard coded paths.

How is this usually done? Should I copy the cmake/ directory of SomeLib into my project and set the CMAKE_MODULE_PATH relatively?

4 Answers 4

Command find_package has two modes: Module mode and Config mode. You are trying to use Module mode when you actually need Config mode.

Module mode

.cmake file located within your project. Something like this:

Note that CMAKE_MODULE_PATH has high priority and may be usefull when you need to rewrite standard Find

Config mode (install)

Config.cmake file located outside and produced by install command of other project ( Foo for example).

Simplified version of config file:

By default project installed in CMAKE_INSTALL_PREFIX directory:

Config mode (use)

Use find_package(. CONFIG) to include FooConfig.cmake with imported target foo :

Note that imported target is highly configurable. See my answer.

Update

If you are running cmake to generate SomeLib yourself (say as part of a superbuild), consider using the User Package Registry. This requires no hard-coded paths and is cross-platform. On Windows (including mingw64) it works via the registry. If you examine how the list of installation prefixes is constructed by the CONFIG mode of the find_packages() command, you’ll see that the User Package Registry is one of elements.

Brief how-to

Associate the targets of SomeLib that you need outside of that external project by adding them to an export set in the CMakeLists.txt files where they are created:

Create a XXXConfig.cmake file for SomeLib in its $ and store this location in the User Package Registry by adding two calls to export() to the CMakeLists.txt associated with SomeLib :

Issue your find_package(SomeLib REQUIRED) commmand in the CMakeLists.txt file of the project that depends on SomeLib without the «non-cross-platform hard coded paths» tinkering with the CMAKE_MODULE_PATH .

When it might be the right approach

This approach is probably best suited for situations where you’ll never use your software downstream of the build directory (e.g., you’re cross-compiling and never install anything on your machine, or you’re building the software just to run tests in the build directory), since it creates a link to a .cmake file in your «build» output, which may be temporary.

But if you’re never actually installing SomeLib in your workflow, calling EXPORT(PACKAGE ) allows you to avoid the hard-coded path. And, of course, if you are installing SomeLib , you probably know your platform, CMAKE_MODULE_PATH , etc, so @user2288008’s excellent answer will have you covered.

Источник

CMake find_package не работает для Eigen?

В настоящее время я разрабатываю библиотеку фильтрации Kalman с использованием Eigen, и я успешно запустил ее на моем Mac разработки. Теперь я пытаюсь настроить его с помощью Travis CI, а CMake не может найти пакет. Сначала я sudo apt install libeigen3-dev , а затем пытаюсь запустить cmake со следующей конфигурацией:

Это прекрасно работает на моем Mac, но в Travis CI возникает следующая ошибка:

Почему я получаю эту ошибку в строке 5, если find_package кажется успешным? Я следую этому руководству с веб-сайта Eigen.

Travis CI работает под управлением Ubuntu 16.04 с CMake 3.12 и пакетом debian Eigen3, а мой Mac работает под управлением CMake 3.13 с Eigen, установленным через homebrew. Я действительно не понимаю, почему CMake ведет себя по-другому.

2 ответа

Вы не упоминаете, какая версия Eigen3 используется в каждом случае.

Похоже, что между Eigen3 3.2 и 3.3 он изменился с использования FindEigen3.cmake на Eigen3Config.cmake . Это изменило способ включения Eigen3 в проект, и в 3.3 он использует Eigen3::Eigen3 .

Но, как оказалось, в Ubuntu 16.04 пакет libeigen3-dev (3.3

beta1-2) , а бета-версии 3.3 не экспортируют Eigen3::Eigen3 , вместо этого он содержит:

Так что просто удалите target_link_libraries(KFilter Eigen3::Eigen) , и все будет в порядке.

Что сработало для меня при использовании Ubuntu 16.04, так это удаление target_link_libraries(KFilter Eigen3::Eigen) и изменение в исходном файле следующей строки #include

Источник

Читайте также:  Как настроить корсары гпк
Оцените статью