CMake:find_package(.)不搜索子目录



我试图找到一个我知道存在并安装在自定义目录中的包(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_PATHSDL2_ROOTHINTSPATHS等,还检查了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)

我在调试这个问题时学到了几件事:

  1. find_package(..)CMAKE_FIND_DEBUG_MODE实际上并没有显示它是否尝试了路径后缀。您也看不到它是将显示的路径作为前缀路径还是绝对路径。路径后缀只附加到前缀路径,如CMAKE_PREFIX_PATH<package>_ROOT。CMake 3.24.1也是如此。例如,find_library(..)具有更加全面的调试输出。

  2. 如果你在一个交叉编译所有常见的";好的猜测";要么离开窗户,要么不工作。设置环境时要非常小心,并检查所有内容。即使是像所选编译器这样的东西也很重要,因为它用于确定库路径(例如32/64位,通过CMAKE_SIZEOF_VOID_P(

  3. 无法通过本地设置变量来修复损坏的环境。它们通常没有任何效果,原因只有底层代码才能向您解释。示例FIND_LIBRARY_USE_LIB64_PATHS有文档记录,但启用它通常没有任何效果,因为底层检查如下所示。如果您的环境不宣传64位,什么都不会发生。如果已经是64位了,这个标志很可能已经自动设置了。

    if (this->Makefile->PlatformIs64Bit() && 
    this->Makefile->GetState()->GetGlobalPropertyAsBool(
    "FIND_LIBRARY_USE_LIB64_PATHS")) {
    this->UseLib64Paths = true;
    }
    
  4. 仔细阅读文档中的内容。这很痛苦,但你可能会错过一个关键的细节,比如FIND_LIBRARY_USE_LIB64_PATHS是一个全局属性,而不是一个变量。

相关内容

  • 没有找到相关文章

最新更新