在 cmake 中设置 PKG_CONFIG_PATH

Posted

技术标签:

【中文标题】在 cmake 中设置 PKG_CONFIG_PATH【英文标题】:set PKG_CONFIG_PATH in cmake 【发布时间】:2017-11-13 04:46:18 【问题描述】:

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

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

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

所以基本上.cmake 有效:

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

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

【问题讨论】:

【参考方案1】:

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

步骤如下:

方法一

CMAKE_PREFIX_PATH可以设置查找.pc文件

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

方法二 第二种方法是使用PKG_CONFIG_PATH,这是一个用于查找.pc 文件的系统环境变量。

set(ENVPKG_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 分别包含头文件(编译阶段)和库(链接阶段)。

我注意到一个非常重要的事情是变量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) 

【讨论】:

我不知道为什么它不使用这些变量来搜索...`CMAKE_PREFIX_PATH、CMAKE_FRAMEWORK_PATH 和 CMAKE_APPBUNDLE_PATH` @DawidDrozd 我不明白您的查询/声明。能详细点吗? 我设置了 CMAKE_PREFIX_PATH 等并且 pkg_search_module 不检查这些路径 @DawidDrozd 然后尝试环境变量。这肯定会找到您的 .pc 文件。请注意,第一个参数 n pkg_search_module 可以是任何东西。我将其设置为 PKG_OPENCV。例如,您可以设置为 ABCD。另外,在使用 CMake 之前先检查你的命令行。 pkg-config --cflags yourpackageconfigfilename. 你不是说 target_include_directories 吗?另外,您能否在答案中添加您正在谈论的 cmake 版本。【参考方案2】:

您可以使用 CMake 行设置 PKG_CONFIG_PATH

set(ENVPKG_CONFIG_PATH "$ENVPKG_CONFIG_PATH:/my/path/to/pkgconfig")

我在file 中做了这个解决方法

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

【讨论】:

我在您的代码中没有看到任何 pkg_search_module。你是如何寻找模块的? 其实是我为支持交叉编译而创建的一个通用文件。我在顶部CMakeLists.txt 中使用了find_package。见here

以上是关于在 cmake 中设置 PKG_CONFIG_PATH的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 CMake/CPack 在 NSIS 中设置向导图像?

CMAKE 3.3.2:在 CMakeLists.txt 中设置构建类型

CMAKE_CXX_COMPILER 未在 qtcreator 中设置

在 cmake 中设置 PKG_CONFIG_PATH

如何使用vs2013的NMake在cmake中设置v120xp

在 CLion 和 Cmake 中设置外部头文件和链接器库的问题 [重复]