在 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_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)
【讨论】:
我不知道为什么它不使用这些变量来搜索...`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 中设置