在cmake中设置PKG_CONFIG_PATH

inf*_*ged 8 pkg-config cmake

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

pkg_search_module(<PREFIX> [REQUIRED] [QUIET] <MODULE> [<MODULE>]*)
Run Code Online (Sandbox Code Playgroud)

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

所以基本上.cmake工作:

find_package( OpenCV REQUIRED HINTS "my/path/to/share/OpenCVConfig.cmake") 
Run Code Online (Sandbox Code Playgroud)

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

inf*_*ged 14

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

以下是步骤:

方法一:

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

set(CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/libs/opencv-install/lib/pkgconfig")
Run Code Online (Sandbox Code Playgroud)

方法II 第二种方法是使用PKG_CONFIG_PATH,它是一个系统环境变量来查找.pc文件.

set(ENV{PKG_CONFIG_PATH}  "${CMAKE_SOURCE_DIR}/libs/opencv-install/lib/pkgconfig")
Run Code Online (Sandbox Code Playgroud)

无论您使用哪种方法,

下一个

find_package(PkgConfig REQUIRED)
pkg_search_module(PKG_OPENCV REQUIRED opencv)  # this looks for opencv.pc file
Run Code Online (Sandbox Code Playgroud)

请注意,PKG_OPENCV变量可以命名为任何名称.无论它被命名,它都被用作前缀.例如,如果您命名ABCD,则include目录将为ABCD_INCLUDE_DIRS

变量PKG_OPENCV_INCLUDE_DIRS和PKG_OPENCV_LIBRARIES分别包含头文件(编译阶段)和库(链接阶段).

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

PKG_OPENCV_LDFLAGS 
Run Code Online (Sandbox Code Playgroud)

此变量包含库路径以及程序包配置文件中列出的所有库.

例如:

include_directories(${PKG_OPENCV_INCLUDE_DIRS})
target_link_libraries (FINAL_BINARY ${PKG_OPENCV_LDFLAGS})
Run Code Online (Sandbox Code Playgroud)

  • 我设置了 `CMAKE_PREFIX_PATH` 等,并且 pkg_search_module 不检查这些路径 (2认同)

Oli*_*erM 5

您可以设置PKG_CONFIG_PATHCMake行:

set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:/my/path/to/pkgconfig")
Run Code Online (Sandbox Code Playgroud)

我在此文件中做了此解决方法

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