我正在使用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(...)...
答案 0 :(得分:0)
我希望它可以在没有您的NO_SYSTEM_ENVIRONMENT_PATH
方法的情况下工作。只需使用find_package(JPEG REQUIRED)
。如果设置了CMAKE_PREFIX_PATH
,那么find_package将首先查找该目录。
如果需要,可以为PATHS
通话指定HINTS
或find_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()