在 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_DIRS
和PKG_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)
我已经在本地构建了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_DIRS
和PKG_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)