- Find_package не работает с библиотекой из источника
- Решение
- Подключение пакетов CMAKE с использованием FIND_PACKAGE
- 3 ответа 3
- Как работает команда find_package() в cmake
- 1 ответ 1
- What use is find_package() when you need to specify CMAKE_MODULE_PATH?
- 4 Answers 4
- Module mode
- Config mode (install)
- Config mode (use)
- CMake find_package не работает для Eigen?
- 2 ответа
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 отрабатывает без ошибок и пердуперждений.
файл поиска библиотеки копируется в папку
Сразу две ошибки:
- Никогда не устанавливайте модуль в папку Modules самого CMake. Эта директория только для родных модулей CMake.
- При установке библиотеки XXX должен устанавливаться не файл FindXXX.cmake , подходящий для MODULE режима find_package, а файл XXXConfig.cmake (или xxx-config.cmake ), подходящий для CONFIG режима.
Разница между скриптами «Find» и «Config» в том, что:
- «Find» скрипт ищет библиотеку, так как не знает, где она установлена. Не знает потому, что этот скрипт поставляется отдельно от библиотеки.
- «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 $
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
Источник