首页 > 解决方案 > CMake find_package 和 NO_SYSTEM_ENVIRONMENT_PATH

问题描述

我正在使用 cmake find_package 来查找要在我的应用程序中使用的 JPEG 库。我确实有该库的两个安装,系统一个,位于:

libjpeg: /usr/lib/x86_64-linux-gnu/libjpeg.a /usr/lib/x86_64-linux-gnu/libjpeg.so

另一个自定义位于:

/my/jpeg/instalation/lib/libjpeg.so

我想通过命令行决定我应该使用什么版本。

例如,要使用自定义的我的 cmake 命令是:

cmake .. -DCMAKE_PREFIX_PATH=/my/jpeg/instalation

并且只寻找系统的 cmake 命令将是:

cmake ..

当定义 CMAKE_PREFIX_PATH 时,我的 CMakeLists.txt 有这样的东西:

find_package(JPEG NO_SYSTEM_ENVIRONMENT_PATH REQUIRED)

当没有定义 CMAKE_PREFIX_PATH 时:

find_package(JPEG REQUIRED)

但是使用 NO_SYSTEM_ENVIRONMENT_PATH 找不到库...我假设使用此标志忽略系统路径,但似乎在 CMAKE_PREFIX_PATH 中声明的那些也被丢弃...

基本上我希望在指定 CMAKE_PREFIX_PATH 时不考虑系统库,并且在未指定 CMAKE_PREFIX_PATH 时应考虑系统库...

我可以看到这适用于自定义路径的唯一方法是执行以下操作:

find_package(JPEG PATHS ${CMAKE_PREFIX_PATH} NO_DEFAULT_PATH)

但这也找不到...我完全迷失了这种 find_package 行为...

PS:我使用的是 cmake 版本 3.10.2,错误总是:

    CMake Error at CMakeLists.txt:7 (find_package):                             
  Could not find a package configuration file provided by "JPEG" with any of
  the following names:                                                      

    JPEGConfig.cmake                                                        
    jpeg-config.cmake                                                       

  Add the installation prefix of "JPEG" to CMAKE_PREFIX_PATH or set         
  "JPEG_DIR" to a directory containing one of the above files.  If "JPEG"   
  provides a separate development package or SDK, be sure it has been       
  installed.  

更新

我没有意识到 find_package 设置仅用于 find_package 功能,即搜索 FindJPEG.cmake 或 JPEGconfig.cmake 脚本,而不是此脚本的内容。我想要的只是使用查找路径或文件的特定函数来完成,例如在 Tom 示例上,但使用 find_library 如下:

set(CUSTOM_JPEG_PATH ON CACHE BOOL "use only custom paths")
set(JPEG_NAMES ${JPEG_NAMES} jpeg libjpeg)
if(CUSTOM_JPEG_PATH)
        #find_package(JPEG REQUIRED
        find_library(JPEG_LIBRARY NAMES ${JPEG_NAMES}
           NO_SYSTEM_ENVIRONMENT_PATH
           NO_CMAKE_SYSTEM_PATH
        )
else()
        #find_package(JPEG REQUIRED
        find_library(JPEG_LIBRARY NAMES ${JPEG_NAMES}
                )
endif()

并且这项工作像预期的那样(而不是给定自定义安装的根文件夹,我需要给出确切的位置 - /my/jpeg/instalation/lib - 为了工作)。但这不是我想要的,我不想重写所有 FindXXX.cmake 脚本以获得我想要的东西,这些 find 脚本有更多关于它们的依赖关系、编译标志等的细节......所以我猜没有办法只使用 find_package(...) 来做我想做的事......

标签: c++cmake

解决方案


我希望它能够在没有你的NO_SYSTEM_ENVIRONMENT_PATH方法的情况下工作。只需使用find_package(JPEG REQUIRED). 如果CMAKE_PREFIX_PATH已设置,则 find_package 将首先查看该目录。

如果您特别想要它,您可以指定PATHSHINTS为您的find_package-call:

set(CUSTOM_JPEG_PATH "" CACHE STRING "path to custom installation of libjpeg")
if(CUSTOM_JPEG_PATH)
        find_package(JPEG REQUIRED 
            PATHS ${CUSTOM_JPEG_PATH} 
            NO_SYSTEM_ENVIRONMENT_PATH
        )
else()
        find_package(JPEG REQUIRED) #default search
endif()

推荐阅读