Windows下CMake链接GLEW静态库出现未定义引用错误求助
问题描述
Windows环境下基于CMake搭建OpenGL开发的C++项目,链接GLFW和静态GLEW库时,调用glewInit()出现未定义引用错误:
CMakeFiles/BideoGame.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x7e): undefined reference to `glewInit@0'
项目的CMakeLists.txt配置:
cmake_minimum_required(VERSION 3.28) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) project(BideoGame VERSION 1.0) add_compile_definitions(GLEW_STATIC) find_package(OpenGL REQUIRED) include_directories(${OPENGL_INCLUDE_DIRS}) set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE) set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE) set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib/glfw-3.3.9) file(GLOB_RECURSE SRC_FILES src/*.cpp) add_executable(BideoGame ${SRC_FILES}) target_link_libraries(BideoGame glfw OpenGL::GL ) target_link_libraries(BideoGame OpenGL::GL) target_link_libraries(BideoGame ${CMAKE_CURRENT_SOURCE_DIR}/lib/glew-2.1.0/lib/Release/x64/glew32s.lib) target_include_directories(BideoGame PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/lib/glew-2.1.0/include)
main.cpp代码:
#include <stdio.h> #include <GL/glew.h> #include <GLFW/glfw3.h> int main(void) { GLFWwindow* window; if (!glfwInit()) return -1; window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); if (!window) { glfwTerminate(); return -1; } glfwMakeContextCurrent(window); glewInit(); while (!glfwWindowShouldClose(window)) { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); glVertex2f(-0.5f,-0.5f); glVertex2f(0.5f, -0.5f); glVertex2f(0.0f, 0.5f); glEnd(); glfwSwapBuffers(window); glfwPollEvents(); } glfwTerminate(); return 0; }
移除glewInit()后可正常编译,保留则报错。
解决方案
1. 确保架构匹配
你链接的是x64版本的glew32s.lib,必须保证CMake生成的项目也是x64架构:
- 命令行配置时添加参数:
cmake .. -G "Visual Studio 17 2022" -A x64(根据你的VS版本调整) - 使用CMake GUI时,在"Configure"步骤选择"x64"作为目标平台,避免默认的Win32(x86)架构。
2. 优化链接配置
合并重复的target_link_libraries调用,确保依赖顺序正确(依赖库放在被依赖库之后),去掉冗余的重复链接项:
target_link_libraries(BideoGame glfw OpenGL::GL ${CMAKE_CURRENT_SOURCE_DIR}/lib/glew-2.1.0/lib/Release/x64/glew32s.lib )
3. 验证GLEW库完整性
确认glew32s.lib存在于指定路径,且是对应版本的静态库。若文件损坏或版本不匹配,重新下载官方GLEW二进制包并解压到正确目录。
4. 改用CMake规范处理GLEW(可选)
通过find_package让CMake自动管理GLEW的编译定义和链接路径,更可靠:
# 添加GLEW路径配置 set(GLEW_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/lib/glew-2.1.0) set(GLEW_STATIC ON) find_package(GLEW REQUIRED) # 链接时直接使用GLEW::GLEW目标 target_link_libraries(BideoGame glfw OpenGL::GL GLEW::GLEW )
这种方式会自动帮你设置GLEW_STATIC编译定义,无需手动添加。
内容的提问来源于stack exchange,提问作者Nutritive
相关产品推荐
相关产品推荐

