gpt4 book ai didi

c++ - CMake find_package 和 NO_SYSTEM_ENVIRONMENT_PATH

转载 作者:太空宇宙 更新时间:2023-11-04 12:39:42 25 4
gpt4 key购买 nike

我正在使用 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_package(...)... 做我想做的事情

最佳答案

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

如果你特别想要它,你可以为你的 find_package 调用指定 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()

关于c++ - CMake find_package 和 NO_SYSTEM_ENVIRONMENT_PATH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54818615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com