You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何封装CMake原生FindPackage.cmake脚本避免find_package无限递归

递归问题根因

你自定义的FindSDL.cmake放在了CMAKE_MODULE_PATH的优先搜索路径下,在自定义脚本内调用find_package(SDL)时,CMake会优先匹配到你写的这个自定义脚本,触发无限递归。

修复方案

在自定义Find模块内调用find_package时添加NO_CMAKE_MODULE_PATH参数,强制跳过项目自定义的模块搜索路径,直接调用CMake内置的官方查找脚本,就可以解决递归问题。

你可以参考以下完整的自定义模块代码实现:

自定义cmake/modules/FindSDL.cmake

find_package(SDL REQUIRED NO_CMAKE_MODULE_PATH)

if (NOT TARGET SDL::SDL)
    add_library(SDL::SDL UNKNOWN IMPORTED)
    set_target_properties(SDL::SDL PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES "${SDL_INCLUDE_DIR}"
        IMPORTED_LOCATION "${SDL_LIBRARY}"
    )
    # 若SDL有额外依赖,可在此处追加INTERFACE_LINK_LIBRARIES属性配置
endif()

同逻辑适配SDL_mixer(cmake/modules/FindSDL_mixer.cmake)

find_package(SDL_mixer REQUIRED NO_CMAKE_MODULE_PATH)

if (NOT TARGET SDL::Mixer)
    add_library(SDL::Mixer UNKNOWN IMPORTED)
    set_target_properties(SDL::Mixer PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES "${SDL_MIXER_INCLUDE_DIR}"
        IMPORTED_LOCATION "${SDL_MIXER_LIBRARY}"
        INTERFACE_LINK_LIBRARIES SDL::SDL
    )
endif()

同逻辑适配SDL_image(cmake/modules/FindSDL_image.cmake)

find_package(SDL_image REQUIRED NO_CMAKE_MODULE_PATH)

if (NOT TARGET SDL::Image)
    add_library(SDL::Image UNKNOWN IMPORTED)
    set_target_properties(SDL::Image PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES "${SDL_IMAGE_INCLUDE_DIR}"
        IMPORTED_LOCATION "${SDL_IMAGE_LIBRARY}"
        INTERFACE_LINK_LIBRARIES SDL::SDL
    )
endif()

这个方案不需要修改CMake内置脚本,也不需要调整你项目主CMakeLists.txt的原有逻辑,兼容CMake 3.1及以上版本,完全满足你的封装需求。

内容的提问来源于stack exchange,提问作者Sergey Kolesnik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:36:02