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

C++项目运行报错:Window.cpp无法找到GLFW/glfw3.h库文件

问题:GLFW头文件找不到,运行时报错

项目构建无报错,但运行main.cpp时提示Window.cpp找不到GLFW/glfw3.h。尝试在Window.h引入该头文件也失败,但Window.cpp中引入能被识别,目标是在main.cpp中实例化Window类。


现有配置与代码

CMakeLists.txt

cmake_minimum_required(VERSION 3.27)
project(Mako)

add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/dependencies/glfw-3.4")
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/dependencies/glfw-3.4/include/GLFW")

find_package(OpenGL REQUIRED)

set(CMAKE_CXX_STANDARD 17)

set(SOURCE_FILES main.cpp
    Window.cpp
    Window.h
)

add_library(Mako ${SOURCE_FILES})

target_link_libraries(Mako glfw ${GLFW_LIBRARIES})

Window.cpp

#include "Window.h"
#include <GLFW/glfw3.h>
#include <cstdio>

namespace graphics
{
    Window *Window::getInstance() { ... }
    void Window::init_window() { ... }
}

Window.h

#ifndef MAKO_WINDOW_H
#define MAKO_WINDOW_H

namespace graphics
{
class Window
{
    Window* window;
    public:
        static Window* getInstance();
        static void init_window();
        void error_callback(int error, const char* description);
};
}

#endif //MAKO_WINDOW_H

main.cpp

#include "Window.cpp"

using namespace graphics;

int main() {
    graphics::Window::init_window();
    return 0;
}

问题分析与解决方案

1. CMake头文件路径错误

你在include_directories里指定的是.../include/GLFW,但#include <GLFW/glfw3.h>需要的是上层的include目录——编译器会从include目录开始查找GLFW子文件夹下的glfw3.h。

修正:

将include_directories改为:

include_directories("${CMAKE_CURRENT_SOURCE_DIR}/dependencies/glfw-3.4/include")

更推荐用target_include_directories替代全局的include_directories,仅给目标库添加头文件路径,避免污染全局配置:

target_include_directories(Mako PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/glfw-3.4/include")

2. main.cpp直接包含.cpp文件的错误

main.cpp中#include "Window.cpp"是错误写法,会导致代码重复编译,甚至引发链接错误。正确做法是包含头文件Window.h。

修正main.cpp:

#include "Window.h"

using namespace graphics;

int main() {
    graphics::Window::init_window();
    return 0;
}

3. 缺少可执行文件构建目标

当前CMake配置仅将源文件打包成静态库Mako,没有生成可执行程序。需要添加add_executable创建运行目标。

修正:

在CMakeLists.txt末尾添加:

add_executable(MakoApp main.cpp)
target_link_libraries(MakoApp Mako)

4. (可选)Window.h中引入GLFW的处理

如果需要在Window.h中使用GLFW类型(如GLFWwindow*),可以通过前向声明避免直接包含头文件,或在路径修正后直接引入:

前向声明写法:

#ifndef MAKO_WINDOW_H
#define MAKO_WINDOW_H

// 前向声明GLFWwindow,减少头文件依赖
typedef struct GLFWwindow GLFWwindow;

namespace graphics
{
class Window
{
    GLFWwindow* window;
    public:
        static Window* getInstance();
        static void init_window();
        void error_callback(int error, const char* description);
};
}

#endif //MAKO_WINDOW_H

最终修正后的CMakeLists.txt

cmake_minimum_required(VERSION 3.27)
project(Mako)

add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/dependencies/glfw-3.4")
find_package(OpenGL REQUIRED)

set(CMAKE_CXX_STANDARD 17)

# 构建静态库
set(LIB_SOURCE_FILES Window.cpp Window.h)
add_library(Mako ${LIB_SOURCE_FILES})
target_include_directories(Mako PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/glfw-3.4/include")
target_link_libraries(Mako glfw ${OPENGL_LIBRARIES})

# 构建可执行文件
add_executable(MakoApp main.cpp)
target_link_libraries(MakoApp Mako)

完成后在CLion中重新加载CMake配置,构建MakoApp目标并运行即可。

内容的提问来源于stack exchange,提问作者caffeine-code

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 23:35:24