如何在CMake中优先查找系统已安装的raylib库再通过FetchContent拉取?
如何在CMake中优先查找系统已安装的raylib库再通过FetchContent拉取?
我正好折腾过类似的CMake配置,给你整理一套完全贴合需求的方案——实现「优先用系统已装的raylib,找不到再自动拉取源码」,还完美适配vcpkg的场景:
第一步:适配vcpkg工具链(可选但推荐)
如果用户机器上装了vcpkg,咱们得让CMake能正确识别它的工具链文件,这样find_package()才能搜到vcpkg里安装的raylib。你可以在CMakeLists.txt最开头加这段逻辑,它会自动检测vcpkg的位置,不用用户手动折腾:
# 自动适配vcpkg工具链(如果环境中存在vcpkg且未指定工具链) if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE) set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "Vcpkg toolchain file") endif()
这段代码会检查系统环境变量里的VCPKG_ROOT,如果用户没手动指定CMAKE_TOOLCHAIN_FILE,就自动把vcpkg的工具链配置上,这样后续的find_package就能优先搜索vcpkg里的包。
第二步:优先查找已安装的raylib,找不到再拉取
接下来就是核心逻辑——先安静查找系统中(包括vcpkg、手动编译安装的)raylib,找到就直接用,找不到再通过FetchContent拉取源码编译:
# 优先查找系统中已安装的raylib(QUIET表示找不到时不报错) find_package(raylib QUIET) # 根据查找结果分支处理 if(raylib_FOUND) message(STATUS "✅ 找到系统已安装的raylib库,版本: ${raylib_VERSION}") else() message(STATUS "🔍 未找到已安装的raylib,将通过FetchContent拉取指定版本源码") # 引入FetchContent模块 include(FetchContent) FetchContent_Declare( raylib GIT_REPOSITORY https://github.com/raysan5/raylib.git GIT_TAG 4.5.0 # 这里替换成你需要的raylib稳定版本号 ) # 自动拉取、配置并构建raylib FetchContent_MakeAvailable(raylib) endif()
如果你需要强制使用某个最低版本的raylib,可以把find_package(raylib QUIET)改成find_package(raylib 4.5.0 QUIET),这样只有找到4.5.0及以上版本的raylib才会用,不符合的话就自动走拉取流程。
第三步:链接raylib到你的游戏项目
最后一步就是把raylib链接到你的游戏可执行文件上,不管是系统找到的还是拉取编译的,这一步逻辑通用:
# 假设你的游戏可执行文件目标名为my_raylib_game,源文件是main.c add_executable(my_raylib_game main.c) # 链接raylib库到目标项目 target_link_libraries(my_raylib_game PRIVATE raylib) # Windows平台额外配置(可选,解决部分兼容性问题) if(WIN32) target_compile_definitions(my_raylib_game PRIVATE _WIN32_WINNT=0x0601) endif()
额外小提示
- FetchContent拉取的raylib源码会存在CMake的缓存目录里,不会占用你项目本身的存储空间,而且拉取一次后,后续构建会直接复用缓存,不用重复下载
- 如果你手动编译安装过raylib到系统默认目录(比如Linux的
/usr/local、Windows的C:\Program Files),find_package也能自动识别到
备注:内容来源于stack exchange,提问作者pavo
相关产品推荐
相关产品推荐

