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

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最佳实践或者会导致编译错误的点:

  1. 使用全局的include_directories会污染所有目标的包含路径,现代CMake更推荐针对单个目标设置包含路径。
  2. 把头文件glad/gl.h加到可执行目标的源文件列表是完全不必要的,头文件不需要参与编译阶段的源文件扫描,只要保证目标能找到它的路径即可。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 12:49:30