web-dev-qa-db-fra.com

définir PKG_CONFIG_PATH dans cmake

J'ai construit opencv localement et l'ai installé dans un répertoire local (pas le système par défaut). Le opencv.pc est présent sous un dossier pkgconfig dans ce dossier local. Comment puis-je trouver ce opencv.pc de cmake, car je veux lier et inclure des fichiers opencv à partir de mon programme.

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

n'a aucun paramètre dans lequel je peux forcer la commande à utiliser un chemin spécifique (similaire à HINTS avec find_package ()) et non la valeur par défaut du système.

Donc, en gros, .cmake fonctionne:

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

mais je voudrais utiliser un opencv.pc situé sous "mon/chemin/vers/pkgconfig (opencv.pc

10
infoclogged

Après avoir fait quelques recherches et un indice du @OlivierM, j'ai trouvé la réponse.

Voici les étapes:

Méthode I:

CMAKE_PREFIX_PATH peut être défini pour rechercher les fichiers .pc

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

Méthode II Une deuxième méthode consiste à utiliser PKG_CONFIG_PATH, qui est une variable d'environnement système pour rechercher des fichiers .pc.

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

Quelle que soit la méthode que vous utilisez,

Prochain

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

Veuillez noter que la variable PKG_OPENCV peut être nommée n'importe quoi. Quel que soit son nom, il est utilisé comme préfixe. Par exemple, si vous nommez ABCD, les répertoires d'inclusion seront ABCD_INCLUDE_DIRS

La variable PKG_OPENCV_INCLUDE_DIRS et PKG_OPENCV_LIBRARIES contient respectivement les fichiers d'en-tête (étape de compilation) et les bibliothèques (étape de liaison).

Une chose très importante que j'ai remarquée est que la variable PKG_OPENCV_LIBRARIES fournit simplement les bibliothèques et non le chemin de la bibliothèque pendant l'étape de liaison. Pour utiliser le chemin de bibliothèque aussi bien dans une commande, il faut utiliser

PKG_OPENCV_LDFLAGS 

Cette variable contient le chemin de la bibliothèque ainsi que toutes les bibliothèques répertoriées dans le fichier de configuration du package.

pour exmaple:

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

Vous pouvez définir PKG_CONFIG_PATH avec la ligne CMake:

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

J'ai fait cette solution dans ce fichier

Il est intéressant de noter que CMake 3.1 étend PKG_CONFIG_PATH avec une variable CMake voir: https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=3df5147

5
OlivierM