CMake find_package和NO_SYSTEM_ENVIRONMENT_PATH

时间:2019-02-22 01:11:04

标签: c++ cmake

我正在使用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 settins仅用于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_package(...)...

1 个答案:

答案 0 :(得分:0)

我希望它可以在没有您的NO_SYSTEM_ENVIRONMENT_PATH方法的情况下工作。只需使用find_package(JPEG REQUIRED)。如果设置了CMAKE_PREFIX_PATH,那么find_package将首先查找该目录。

如果需要,可以为PATHS通话指定HINTSfind_package

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()