Windows下使用CMake静态链接GLEW时出现链接错误求助
Windows下MinGW静态链接GLEW的问题解决
问题背景
我已经查阅了大量相关文档,尝试过多种方案,但都没找到适配我场景的解决办法。目前在Windows环境下用CMake静态链接GLEW库时,不同操作会触发不同错误,我的CMake配置如下:
cmake_minimum_required(VERSION 3.24) project(Physics_Engine) set(CMAKE_CXX_STANDARD 17) add_executable(${PROJECT_NAME} src/main.cpp) #target_compile_definitions(${PROJECT_NAME} PRIVATE GLEW_STATIC) find_package(OpenGL REQUIRED) add_subdirectory(lib/GLFW) include_directories(lib/GLEW-WIN-LIB/include) target_link_directories(${PROJECT_NAME} PUBLIC lib/GLEW-WIN-LIB/lib/Release/x64) target_link_libraries(${PROJECT_NAME} opengl32 glfw glew32s)
遇到的两种错误:
- 未添加
GLEW_STATIC编译定义时:
[1/1] Linking CXX executable Physics_Engine.exe FAILED: Physics_Engine.exe cmd.exe /C "cd . && D:\JetBrains\CLion\bin\mingw\bin\g++.exe -g CMakeFiles/Physics_Engine.dir/src/main.cpp.obj -o Physics_Engine.exe -Wl,--out-implib,libPhysics_Engine.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -LC:/Users/matts/Documents/Projects/physics-engine-cpp/lib/GLEW-WIN-LIB/lib/Release/x64 -lopengl32 lib/GLFW/src/libglfw3.a -lglew32s -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ." D:\JetBrains\CLion\bin\mingw\bin/ld.exe: CMakeFiles/Physics_Engine.dir/src/main.cpp.obj:C:/Users/matts/Documents/Projects/physics-engine-cpp/src/main.cpp:12: undefined reference to `__imp_glewInit'
- 添加
target_compile_definitions(${PROJECT_NAME} PRIVATE GLEW_STATIC)后:
[2/2] Linking CXX executable Physics_Engine.exe FAILED: Physics_Engine.exe cmd.exe /C "cd . && D:\JetBrains\CLion\bin\mingw\bin\g++.exe -g CMakeFiles/Physics_Engine.dir/src/main.cpp.obj -o Physics_Engine.exe -Wl,--out-implib,libPhysics_Engine.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -LC:/Users/matts/Documents/Projects/physics-engine-cpp/lib/GLEW-WIN-LIB/lib/Release/x64 -lopengl32 lib/GLFW/src/libglfw3.a -lglew32s -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ." Warning: corrupt .drectve at end of def file D:\JetBrains\CLion\bin\mingw\bin/ld.exe: C:/Users/matts/Documents/Projects/physics-engine-cpp/lib/GLEW-WIN-LIB/lib/Release/x64/glew32s.lib(tmp/glew_static/Release/x64/glew.obj):(.text$mn+0xd): undefined reference to `__imp_wglGetProcAddress'
还伴随10条类似__imp_wglGetProcAddress的未定义错误。试过target_compile_definitions、compile_definitions、add_definitions三种方式添加编译定义,都没解决问题。
错误原因分析
第一种错误:
未定义GLEW_STATIC时,GLEW头文件会默认把所有函数声明为动态库导出/导入(带__imp_前缀),但你链接的是静态库glew32s.lib,静态库中的函数没有__imp_前缀,导致符号不匹配,触发未定义引用错误。第二种错误:
你使用的glew32s.lib是MSVC编译器编译的静态库,而当前用的是MinGW的g++链接器。MinGW的链接器无法正确解析MSVC格式静态库中的指令段(.drectve),同时MSVC编译的GLEW会依赖MSVC的OpenGL导入库,和MinGW的opengl32.lib不兼容,所以出现__imp_wglGetProcAddress这类未定义错误。
解决方案
方案1:使用MinGW编译的GLEW静态库
- 下载MinGW版本的GLEW预编译库,或者自己用MinGW编译GLEW源码:
- 拿到GLEW源码后,在MinGW终端执行
make编译,会生成libglew32s.a(静态库)和对应的头文件。
- 拿到GLEW源码后,在MinGW终端执行
- 替换CMake中的库路径:
- 将
lib/GLEW-WIN-LIB替换为MinGW版本GLEW的路径,确保lib目录下是.a格式的静态库。
- 将
方案2:调整CMake配置适配MinGW
修改后的CMake配置如下,确保编译定义、库路径和链接顺序正确:
cmake_minimum_required(VERSION 3.24) project(Physics_Engine) set(CMAKE_CXX_STANDARD 17) add_executable(${PROJECT_NAME} src/main.cpp) # 必须定义GLEW_STATIC,告诉编译器使用静态链接模式 target_compile_definitions(${PROJECT_NAME} PRIVATE GLEW_STATIC) find_package(OpenGL REQUIRED) add_subdirectory(lib/GLFW) # 使用MinGW版本GLEW的头文件路径 target_include_directories(${PROJECT_NAME} PRIVATE lib/GLEW-MINGW/include) # 使用MinGW版本GLEW的静态库路径 target_link_directories(${PROJECT_NAME} PRIVATE lib/GLEW-MINGW/lib) # 链接顺序:GLEW要放在opengl32前面 target_link_libraries(${PROJECT_NAME} glfw glew32s opengl32)
关键注意点
- 静态链接GLEW时必须定义
GLEW_STATIC,且要在包含GLEW头文件之前定义(CMake的target_compile_definitions会自动处理编译顺序)。 - 确保使用的GLEW库和当前编译器(MinGW/MSVC)匹配,跨编译器的静态库无法直接链接。
- 链接顺序要注意:GLEW依赖OpenGL,所以
glew32s要放在opengl32前面。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

