在 cmake 中设置 PKG_CONFIG_PATH

set PKG_CONFIG_PATH in cmake

我已经在本地构建了opencv并将其安装到本地目录(不是系统默认目录)。 opencv.pc 位于此本地文件夹中的文件夹 pkgconfig 下。我如何从 cmake 中找到这个 opencv.pc,因为我想 link 并从我的程序中包含 opencv 文件。

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

没有任何参数可以强制命令使用特定路径(类似于 find_package() 的 HINTS)而不是系统默认值。

所以基本上 .cmake 有效:

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

但我想使用位于 my/path/to/pkgconfig/opencv.pc 下的 opencv.pc

您可以使用 CMake 行设置 PKG_CONFIG_PATH

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

我在这个file

中做了这个解决方法

有趣的是,CMake 3.1 似乎用一些 CMake 变量扩展了 PKG_CONFIG_PATH,请参阅:https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=3df51470

经过一些研究和@OlivierM 的提示后,我找到了答案。

步骤如下:

方法一:

CMAKE_PREFIX_PATH可以设置查找.pc个文件

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

方法二 第二种方法是使用 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_DIRSPKG_OPENCV_LIBRARIES分别包含头文件(编译阶段)和库(link阶段)。

我注意到一个非常重要的事情是变量 PKG_OPENCV_LIBRARIES 在 link 阶段只提供库而不是库路径。为了在一个命令中也使用库路径,必须使用

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)