我试图找到一个我知道存在并安装在自定义目录中的包(SDL2和SDL2_image(。既然我在Linux上,它应该搜索所有这些子目录,但它没有,我看不出为什么。
<prefix>/(lib/<arch>|lib*|share)/cmake/<name>*/ (U)
<prefix>/(lib/<arch>|lib*|share)/<name>*/ (U)
<prefix>/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/ (U)
<prefix>/<name>*/(lib/<arch>|lib*|share)/cmake/<name>*/ (W/U)
<prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/ (W/U)
<prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/ (W/U)
我尝试了CMAKE_PREFIX_PATH
、SDL2_ROOT
、HINTS
、PATHS
等,还检查了NO_*
变量,但即使使用set(CMAKE_FIND_DEBUG_MODE TRUE)
,它也只显示<prefix>/SDL2Config.cmake
和<prefix>/sdl2-config.cmake
作为它找到的所有前缀的猜测。
我很困惑,为什么它只是拒绝搜索记录的子目录。我不想指定完整的路径,因为这只是对将来可能更改的内容进行硬编码,并且根据系统的不同而有所不同。
我使用的是CMake 3.24.1。感谢您的帮助。
代码:
set(CMAKE_PREFIX_PATH ${SDL_INSTALL_DIR})
set(CMAKE_FIND_DEBUG_MODE TRUE)
find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)
set(CMAKE_FIND_DEBUG_MODE FALSE)
我在调试这个问题时学到了几件事:
-
find_package(..)
的CMAKE_FIND_DEBUG_MODE
实际上并没有显示它是否尝试了路径后缀。您也看不到它是将显示的路径作为前缀路径还是绝对路径。路径后缀只附加到前缀路径,如CMAKE_PREFIX_PATH
或<package>_ROOT
。CMake 3.24.1也是如此。例如,find_library(..)
具有更加全面的调试输出。 -
如果你在一个交叉编译所有常见的";好的猜测";要么离开窗户,要么不工作。设置环境时要非常小心,并检查所有内容。即使是像所选编译器这样的东西也很重要,因为它用于确定库路径(例如32/64位,通过
CMAKE_SIZEOF_VOID_P
( -
无法通过本地设置变量来修复损坏的环境。它们通常没有任何效果,原因只有底层代码才能向您解释。示例
FIND_LIBRARY_USE_LIB64_PATHS
有文档记录,但启用它通常没有任何效果,因为底层检查如下所示。如果您的环境不宣传64位,什么都不会发生。如果已经是64位了,这个标志很可能已经自动设置了。if (this->Makefile->PlatformIs64Bit() && this->Makefile->GetState()->GetGlobalPropertyAsBool( "FIND_LIBRARY_USE_LIB64_PATHS")) { this->UseLib64Paths = true; }
-
仔细阅读文档中的内容。这很痛苦,但你可能会错过一个关键的细节,比如
FIND_LIBRARY_USE_LIB64_PATHS
是一个全局属性,而不是一个变量。