c++ - 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(...) 来做我想做的事......
解决方案
我希望它能够在没有你的NO_SYSTEM_ENVIRONMENT_PATH
方法的情况下工作。只需使用find_package(JPEG REQUIRED)
. 如果CMAKE_PREFIX_PATH
已设置,则 find_package 将首先查看该目录。
如果您特别想要它,您可以指定PATHS
或HINTS
为您的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()
推荐阅读
- sql - 基于另一个表从一个表中删除一系列行作为 SQL 中的输入
- c++ - 继承抽象类Stream的SLCD类中printf的实现
- r - 使用连续预测变量的多个值计算 emmeans
- python - Python将网站表数据读入Dataframe
- python - 从 Firebird 数据库中的表中获取数据
- javascript - 如何独立使用 Bootstrap dropdown.js?
- twitter-bootstrap - 折叠的引导砌体面板在第一次展开时会四处移动
- html - 如何根据浏览器大小更改 tabindex 和 aria-hidden 的值?
- c++ - 了解 TCMalloc 的“释放到操作系统的字节数(又名未映射)”统计信息
- jquery - 将 Vimeo 缩略图 URL 放入每个相同的类 div - jquery