установить PKG_CONFIG_PATH в cmake

Я создал opencv локально и установил его в локальный каталог (не по умолчанию в системе). opencv.pc находится в папке pkgconfig в этой локальной папке. Как я могу найти этот opencv.pc из cmake, потому что я хочу связать и включить файлы opencv из моей программы.

pkg_search_module(<PREFIX> [REQUIRED] [QUIET] <MODULE> [<MODULE>]*)

не имеет никакого параметра, в котором я могу заставить команду использовать определенный путь (аналогично ПОДСКАЗКАМ с find_package()), а не системный по умолчанию.

Итак, в основном .cmake работает:

find_package(OpenCV REQUIRED HINTS "my/path/to/share/OpenCVConfig.cmake") 

но я хотел бы использовать opencv.pc, расположенный под my/path/to/pkgconfig/opencv.pc.


person infoclogged    schedule 11.06.2017    source источник


Ответы (2)


Проведя небольшое исследование и подсказку от @OlivierM, я нашел ответ.

Вот шаги:

Метод I:

CMAKE_PREFIX_PATH можно настроить для поиска .pc файлов

set(CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/libs/opencv-install")

Метод II Второй метод заключается в использовании PKG_CONFIG_PATH, переменной системной среды, для поиска .pc файлов.

set(ENV{PKG_CONFIG_PATH} "${CMAKE_SOURCE_DIR}/libs/opencv-install/lib/pkgconfig")

Независимо от того, какой метод вы используете,

Для старого (традиционного) CMake:

find_package(PkgConfig REQUIRED)
pkg_search_module(PKG_OPENCV REQUIRED opencv)  # this looks for opencv.pc file

Обратите внимание, что переменная PKG_OPENCV может называться как угодно. Как бы это ни называлось, оно используется как префикс. Например, если вы назовете ABCD, тогда включаемые каталоги будут ABCD_INCLUDE_DIRS.

Переменная PKG_OPENCV_INCLUDE_DIRS и PKG_OPENCV_LIBRARIES содержит файлы заголовков (этап компиляции) и библиотеки (этап компоновки) соответственно.

Одна очень важная вещь, которую я заметил, заключалась в том, что переменная PKG_OPENCV_LIBRARIES просто предоставляет библиотеки, а не путь к библиотеке на этапе компоновки. Чтобы использовать путь к библиотеке в одной команде, нужно использовать

PKG_OPENCV_LDFLAGS 

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

например:

include_directories(${PKG_OPENCV_INCLUDE_DIRS})
target_link_libraries (FINAL_BINARY ${PKG_OPENCV_LDFLAGS})

Для современного CMake:

В современном CMake нам не нужны переменные, нам нужны цели.

find_package(PkgConfig REQUIRED)
# this looks for opencv.pc file and creates a new target
# IMPORTED_TARGET requires CMake >= 3.6.3
pkg_search_module(PKG_OPENCV REQUIRED IMPORTED_TARGET opencv)

Все переменные по-прежнему будут создаваться для обратной совместимости, но IMPORTED_TARGET создаст цель, которую вы можете использовать в своем проекте, которая автоматически распространит все свои требования к сборке и использованию:

target_link_libraries(my_proj PRIVATE PkgConfig::PKG_OPENCV) 
person infoclogged    schedule 11.06.2017
comment
Я не знаю, почему он не использует эти переменные для поиска... `CMAKE_PREFIX_PATH, CMAKE_FRAMEWORK_PATH и CMAKE_APPBUNDLE_PATH` - person Dawid Drozd; 21.09.2017
comment
@DawidDrozd Я не понимаю ваш запрос/утверждение. Можете ли вы уточнить? - person infoclogged; 26.09.2017
comment
Я установил CMAKE_PREFIX_PATH и т. д., а pkg_search_module не проверяет эти пути. - person Dawid Drozd; 26.09.2017
comment
@DawidDrozd тогда попробуйте переменную окружения. Это определенно найдет ваш файл .pc. Обратите внимание, что первый параметр n pkg_search_module может быть любым. Я установил его в PKG_OPENCV. Вы можете установить на ABCD, например. Кроме того, сначала проверьте свою командную строку, прежде чем переходить к CMake. pkg-config --cflags yourpackageconfigfilename. - person infoclogged; 27.09.2017
comment
вы не имеете в виду target_include_directories? Кроме того, не могли бы вы добавить версию cmake, о которой вы говорите, в своем ответе. - person johnb003; 19.06.2018
comment
отличается только областью действия include_directories. Вы можете использовать любой из них. Я тестировал с 2.6. Но пока я использую 3.8.2. С какими проблемами вы сталкиваетесь? - person infoclogged; 19.06.2018
comment
Способ 1 неверный. Это префиксный путь, поэтому он будет выглядеть примерно так: set(CMAKE_PREFIX_PATH /path/to/opencv/install/"). Затем FindPkgConfig.cmake дополняет это соответствующим образом. - person fdk1342; 16.08.2019
comment
Да, как комментарий @Fred, в методе 1 CMAKE_PREFIX_PATH должен быть установлен для папки, в которой есть общий ресурс/pkgconfig, например. когда какая-либо пользовательская сборка используется ./configure --prefix=SOME_FOLDER когда файлы pc создаются в SOME_FOLDER/share/pkgconfig. - person MariuszW; 07.10.2019
comment
В Windows под Cygwin метод 1 (CMAKE_PREFIX_PATH, CMAKE_FRAMEWORK_PATH, CMAKE_APPBUNDLE_PATH) теперь не работает, см. gitlab.kitware.com/cmake/cmake/-/issues/21775. Другая причина, по которой метод 1 может не работать для кого-то, заключается в неправильном использовании: PKG_CONFIG_PATH должен включать префикс /lib/pkgconfig, а CMAKE_PREFIX_PATH — нет (поскольку FindPkgConfig.cmake добавляет его автоматически). - person Alexander Samoylov; 04.02.2021

Вы можете установить PKG_CONFIG_PATH с помощью строки CMake:

set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:/my/path/to/pkgconfig")

Я использовал этот обходной путь в этом файле.

Интересно, что CMake 3.1 расширяет PKG_CONFIG_PATH с помощью некоторой переменной CMake, см.: https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=3df51470

person OlivierM    schedule 11.06.2017
comment
Я не вижу никакого pkg_search_module в вашем коде. как ищешь модули? - person infoclogged; 11.06.2017
comment
На самом деле это обычный файл, который я создал для поддержки кросс-компиляции. Я использовал find_package в топе CMakeLists.txt. См. здесь - person OlivierM; 11.06.2017