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

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)

遇到的两种错误:

  1. 未添加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'
  1. 添加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三种方式添加编译定义,都没解决问题。


错误原因分析

  1. 第一种错误:
    未定义GLEW_STATIC时,GLEW头文件会默认把所有函数声明为动态库导出/导入(带__imp_前缀),但你链接的是静态库glew32s.lib,静态库中的函数没有__imp_前缀,导致符号不匹配,触发未定义引用错误。

  2. 第二种错误:
    你使用的glew32s.lib是MSVC编译器编译的静态库,而当前用的是MinGW的g++链接器。MinGW的链接器无法正确解析MSVC格式静态库中的指令段(.drectve),同时MSVC编译的GLEW会依赖MSVC的OpenGL导入库,和MinGW的opengl32.lib不兼容,所以出现__imp_wglGetProcAddress这类未定义错误。


解决方案

方案1:使用MinGW编译的GLEW静态库

  1. 下载MinGW版本的GLEW预编译库,或者自己用MinGW编译GLEW源码:
    • 拿到GLEW源码后,在MinGW终端执行make编译,会生成libglew32s.a(静态库)和对应的头文件。
  2. 替换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:15:42