CMake find_package and NO_SYSTEM_ENVIRONMENT_PATH

CMake find_package and NO_SYSTEM_ENVIRONMENT_PATH

本文关键字:SYSTEM ENVIRONMENT NO PATH and find package CMake      更新时间:2023-10-16

我正在使用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 ..

和我的cmakelists.txt定义了cmake_prefix_path时具有类似的东西:

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 funcionality,这是,搜索findjpeg.cmake或jpegconfig.cmake.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(...)...

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

如果您需要它,则可以为find_package -CALL指定PATHSHINTS

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

使用vcpkg。最简单的是通过Project_options,它自动设置VCPKG并包括其工具链。

vcpkg覆盖了默认的cmake路径和环境变量,因此VCPKG提供的路径比系统优先。

vcpkg.json

{
  "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg/master/scripts/vcpkg.schema.json",
  "name": "myproject",
  "version-string": "0.1.0",
  "builtin-baseline": "70d3ac3a1754fffcd7d099b2b268bf7dfe70c162",
  "dependencies": [
    {
      "name": "libjpeg-turbo",
      "version>=": "2.0.6"
    }
  ]
}

cmakelists.txt

cmake_minimum_required(VERSION 3.16)
# Add project_options v0.19.0
# https://github.com/cpp-best-practices/project_options
# Change the version in the following URL to update the package (watch the releases of the repository for future updates)
include(FetchContent)
FetchContent_Declare(_project_options URL https://github.com/cpp-best-practices/project_options/archive/refs/tags/v0.19.0.zip)
FetchContent_MakeAvailable(_project_options)
include(${_project_options_SOURCE_DIR}/Index.cmake)
run_vcpkg()
project(myproject LANGUAGES CXX C)
project_options(
  # all the options you need
)
add_executable(myprogram main.cpp)
find_package(JPEG REQUIRED)
target_link_libraries(main PRIVATE ${JPEG_LIBRARIES})
target_include_directories(main PRIVATE ${JPEG_INCLUDE_DIR})