【问题标题】:set PKG_CONFIG_PATH in cmake在 cmake 中设置 PKG_CONFIG_PATH
【发布时间】: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

【问题讨论】:

    标签: cmake pkg-config


    【解决方案1】:

    在做了一些研究和@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 分别包含头文件(编译阶段)和库(链接阶段)。

    我注意到一个非常重要的事情是变量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(ENV{PKG_CONFIG_PATH} "$ENV{PKG_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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    相关资源
    最近更新 更多