CMake使用FetchContent获取GLFW并链接其deps目录依赖的配置问题
CMake使用FetchContent获取GLFW并链接其deps目录依赖的配置问题
看起来你正在尝试通过FetchContent引入GLFW,同时想直接使用它自带的deps目录下的glad依赖,但目前的配置可能存在一些小细节问题,我来帮你梳理并修正一下。
首先先明确你当前的文件结构:
├── CMakeLists.txt ├── main.cpp ├── build ├── cmake │ └── AddGLFW.cmake
你当前的配置文件内容
CMakeLists.txt
cmake_minimum_required(VERSION 3.20) project(Test1) list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") include(AddGLFW) include_directories("${GLFW_SOURCE_DIR}/deps") set(GLAD_GL "${GLFW_SOURCE_DIR}/deps/glad/gl.h") add_executable(main WIN32 main.cpp ${GLAD_GL}) target_link_libraries(main glfw)
AddGLFW.cmake
include(FetchContent) FetchContent_Declare ( glfw GIT_REPOSITORY https://github.com/glfw/glfw.git GIT_TAG 3.4 ) set(GLFW_BUILD_DOCS OFF CACHE BOOL "") set(GLFW_INSTALL OFF CACHE BOOL "") FetchContent_MakeAvailable(glfw)
main.cpp
#include "glad/gl.h" #include "GLFW/glfw3.h" // 后续应该是GLFW初始化及业务代码
问题分析
你的整体思路是对的,但有几个不符合CMake最佳实践或者会导致编译错误的点:
- 使用全局的
include_directories会污染所有目标的包含路径,现代CMake更推荐针对单个目标设置包含路径。 - 把头文件
glad/gl.h加到可执行目标的源文件列表是完全不必要的,头文件不需要参与编译阶段的源文件扫描,只要保证目标能找到它的路径即可。 - GLFW的
deps目录下的glad不仅有头文件,还有对应的实现文件glad.c,你没有把这个文件加入项目,会导致链接阶段出现未定义符号的错误。
修正后的配置方案
调整后的CMakeLists.txt
cmake_minimum_required(VERSION 3.20) project(Test1) list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") include(AddGLFW) # 创建可执行目标,只传入必要的源文件 add_executable(main WIN32 main.cpp) # 将glad的实现文件添加到目标中 target_sources(main PRIVATE "${GLFW_SOURCE_DIR}/deps/glad/glad.c") # 针对main目标设置GLFW deps目录的包含路径,PRIVATE表示仅当前目标可用 target_include_directories(main PRIVATE "${GLFW_SOURCE_DIR}/deps") # 链接GLFW库,PRIVATE明确依赖作用域 target_link_libraries(main PRIVATE glfw)
关键调整说明
- 移除了冗余的头文件源文件配置,专注于添加必要的实现文件
glad.c。 - 用
target_include_directories替代全局的include_directories,更符合现代CMake的模块化思想,避免影响其他目标。 - 给链接和包含路径都加上
PRIVATE关键字,明确依赖的作用域,让CMake的依赖关系更清晰。
验证main.cpp的写法
确保你的main.cpp能够正确引用头文件并编写基础逻辑,比如:
#include "glad/gl.h" #include "GLFW/glfw3.h" int main() { // 初始化GLFW if (!glfwInit()) { return -1; } // 创建窗口和OpenGL上下文(示例) GLFWwindow* window = glfwCreateWindow(800, 600, "Test Window", NULL, NULL); if (!window) { glfwTerminate(); return -1; } glfwMakeContextCurrent(window); // 主循环 while (!glfwWindowShouldClose(window)) { // 渲染逻辑 glClear(GL_COLOR_BUFFER_BIT); glfwSwapBuffers(window); glfwPollEvents(); } glfwTerminate(); return 0; }
这样调整后,你应该就能正常编译并运行项目,顺利使用GLFW和它自带的glad依赖了。
备注:内容来源于stack exchange,提问作者Iaoh
相关产品推荐
相关产品推荐

