跨平台游戏开发CMake项目窗口无法打开及编译错误求助
问题分析与解决方案
核心错误根源
编译报错的直接原因是**service_locator.h文件末尾缺少分号**,导致编译器解析后续代码时出现语法混乱,进而引发一系列连锁错误(如glfw_window.h中的类定义报错)。此外还有几处细节问题需要修正:
具体修复步骤
1. 修复service_locator.h的语法错误
C++类定义结束后必须添加分号,补充后代码如下:
#pragma once #include <memory> #include <template_engine/platform/window.h> class ServiceLocator { public: static inline const std::unique_ptr<Window>& GetWindow() { return _window; } static inline void Provide(Window* window) { if(_window == nullptr) { _window = std::unique_ptr<Window>(window); } } private: static inline std::unique_ptr<Window> _window = nullptr; }; // 此处必须添加分号
2. 完善glfw_window.cpp的窗口初始化逻辑
当前代码创建窗口后未设置GLFW上下文,且缺少窗口创建失败的判断,修正后:
void CustomWindow::OpenWindow() { glfwInit(); _window = glfwCreateWindow(800, 600, "template engine window", nullptr, nullptr); if (_window) { glfwMakeContextCurrent(_window); // 设置窗口上下文 } } bool CustomWindow::Update() { if (!_window) return true; // 窗口创建失败直接退出循环 glfwPollEvents(); return glfwWindowShouldClose(_window); }
3. 修正CMake配置路径问题
在external/engine/CMakeLists.txt中,调整头文件路径引用,确保GLFW和GLM的头文件能被正确找到:
target_include_directories(${PROJECT_NAME} PUBLIC $<INSTALL_INTERFACE:include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> ${GLM_INCLUDE_DIRS} PRIVATE ${GLFW_INCLUDE_DIR} )
4. 统一编译器环境
你的tasks.json使用MinGW的g++,但c_cpp_properties.json配置的是MSVC,导致IntelliSense与实际编译环境不一致,建议二选一统一:
- 若使用MSVC:修改
tasks.json使用cl.exe编译; - 若使用MinGW:修改
c_cpp_properties.json的compilerPath为C:/msys64/mingw64/bin/g++.exe,intelliSenseMode改为windows-gcc-x64。
验证修复
完成上述修改后,重新运行CMake生成项目并编译,此前的语法错误会全部消失,窗口可正常创建并运行。
内容的提问来源于stack exchange,提问作者RomektBoi
相关产品推荐
相关产品推荐

