CLion与VS中链接32位OpenGL库(glew32等)失败求助
解决CLion中32位OpenGL库(GLEW/GLUT)链接失败问题
问题现象
MinGW编译时的未定义引用错误
C:\Program Files\JetBrains\CLion 2023.3.2\bin\mingw\bin/ld.exe: C:\Users\Ziad\AppData\Local\Temp\cc1ufq3n.o:OpenGLMeshLoader.cpp:(.text+0xa3): undefined reference to `glGenTextures' C:\Program Files\JetBrains\CLion 2023.3.2\bin\mingw\bin/ld.exe: C:\Users\Ziad\AppData\Local\Temp\cc1ufq3n.o:OpenGLMeshLoader.cpp:(.text+0xb5): undefined reference to `glBindTexture' C:\Program Files\JetBrains\CLion 2023.3.2\bin\mingw\bin/ld.exe: C:\Users\Ziad\AppData\Local\Temp\cc1ufq3n.o:OpenGLMeshLoader.cpp:(.text+0xe9): undefined reference to `gluBuild2DMipmaps' C:\Program Files\JetBrains\CLion 2023.3.2\bin\mingw\bin/ld.exe: C:\Users\Ziad\AppData\Local\Temp\cc1ufq3n.o:OpenGLMeshLoader.cpp:(.text+0x100): undefined reference to `glTexParameterf' C:\Program Files\JetBrains\CLion 2023.3.2\bin\mingw\bin/ld.exe: C:\Users\Ziad\AppData\Local\Temp\cc1ufq3n.o:OpenGLMeshLoader.cpp:(.text+0x117): undefined reference to `glTexParameterf' C:\Program Files\JetBrains\CLion 2023.3.2\bin\mingw\bin/ld.exe: C:\Users\Ziad\AppData\Local\Temp\cc1ufq3n.o:OpenGLMeshLoader.cpp:(.text+0x176): undefined reference to `glTexParameterf' C:\Program Files\JetBrains\CLion 2023.3.2\bin\mingw\bin/ld.exe: C:\Users\Ziad\AppData\Local\Temp\cc1ufq3n.o:OpenGLMeshLoader.cpp:(.text+0x1a0): undefined reference to `glTexParameterf' C:\Program Files\JetBrains\CLion 2023.3.2\bin\mingw\bin/ld.exe: C:\Users\Ziad\AppData\Local\Temp\cc1ufq3n.o:OpenGLMeshLoader.cpp:(.text+0x1b7): undefined reference to `glTexEnvf' C:\Program Files\JetBrains\CLion 2023.3.2\bin\mingw\bin/ld.exe: C:\Users\Ziad\AppData\Local\Temp\cc1ufq3n.o:OpenGLMeshLoader.cpp:(.text+0x222): undefined reference to `auxDIBImageLoadA' C:\Program Files\JetBrains\CLion 2023.3.2\bin\mingw\bin/ld.exe: C:\Users\Ziad\AppData\Local\Temp\cc1ufq3n.o:OpenGLMeshLoader.cpp:(.text+0x237): undefined reference to `glGenTextures' C:\Program Files\JetBrains\CLion 2023.3.2\bin\mingw\bin/ld.exe: C:\Users\Ziad\AppData\Local\Temp\cc1ufq3n.o:OpenGLMeshLoader.cpp:(.text+0x249): undefined reference to `glBindTexture' ...
Visual Studio编译时的链接错误
/out:OpenGLMeshLoader.exe OpenGLMeshLoader.obj LINK : fatal error LNK1104: cannot open file 'glew32.lib' Microsoft (R) C/C++ Optimizing Compiler Version 19.29.30153 for x64 Copyright (C) Microsoft Corporation. All rights reserved.
当前CMakeLists.txt配置
cmake_minimum_required(VERSION 3.20) project(Graphics) set(CMAKE_CXX_STANDARD 17) set(CMAKE_C_FLAGS -m32) set(CMAKE_CXX_FLAGS -m32) include_directories(${CMAKE_SOURCE_DIR}/include) file(GLOB_RECURSE SOURCES "src/*.cpp" "include/*.h") add_executable(Graphics ${SOURCES}) link_directories(${CMAKE_SOURCE_DIR}/lib) target_link_libraries(Graphics glew32 glut32 glaux )
解决方案
1. 匹配库与编译器的兼容性
- MinGW必须使用MinGW编译的32位库,MSVC生成的
.lib静态库和MinGW不兼容,不能混用。可从GLEW、GLUT官方渠道下载对应MinGW版本的库文件(通常后缀为.a或适配MinGW的.lib)。 - Visual Studio下必须使用MSVC编译的32位库,同时确保编译平台设置为Win32(默认可能是x64,和32位库不匹配)。
2. 修正CMakeLists.txt配置
以下是适配MinGW和VS的改进配置,解决路径、平台、Debug/Release区分问题:
cmake_minimum_required(VERSION 3.20) project(Graphics) set(CMAKE_CXX_STANDARD 17) # 强制32位编译,保留原有编译选项的同时避免覆盖默认配置 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32") # 针对VS,强制设置编译平台为Win32 if(MSVC) set(CMAKE_GENERATOR_PLATFORM Win32) endif() # 头文件路径 include_directories(${CMAKE_SOURCE_DIR}/include) # 源文件仅包含cpp,无需将h文件加入可执行目标 file(GLOB_RECURSE SOURCES "src/*.cpp") add_executable(Graphics ${SOURCES}) # 使用target_link_directories指定库路径,比全局link_directories更规范 target_link_directories(Graphics PRIVATE ${CMAKE_SOURCE_DIR}/lib) # 根据编译器类型链接对应库,同时补充系统OpenGL依赖 if(MINGW) target_link_libraries(Graphics PRIVATE glew32 glut32 glaux # MinGW需要显式链接系统OpenGL核心库 opengl32 glu32 ) elseif(MSVC) # 区分Debug和Release版本的库,GLEW Debug库通常为glew32d.lib set(GLEW_LIB "glew32.lib") set(GLUT_LIB "glut32.lib") set(GLAUX_LIB "glaux.lib") if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(GLEW_LIB "glew32d.lib") # 若有GLUT/Glaux的Debug版本,可在此替换 # set(GLUT_LIB "glut32d.lib") endif() target_link_libraries(Graphics PRIVATE ${GLEW_LIB} ${GLUT_LIB} ${GLAUX_LIB} opengl32 glu32 ) endif()
3. 库文件的验证与放置
- 确认
lib目录下的库文件与当前编译器匹配:- MinGW:放入MinGW编译的32位库(如GLEW解压后
lib/MinGW下的文件) - VS:放入MSVC编译的32位库(如GLEW解压后
lib/Release/Win32或lib/Debug/Win32下的文件)
- MinGW:放入MinGW编译的32位库(如GLEW解压后
- Debug模式下,GLEW需链接
glew32d.lib,Release模式链接glew32.lib,避免版本混淆。
4. 代码中添加必要的宏定义
如果使用静态库,需在包含GLEW头文件前定义GLEW_STATIC,确保编译器正确识别静态库符号:
#define GLEW_STATIC #include <GL/glew.h>
内容的提问来源于stack exchange,提问作者Ziad Abdelrahman
相关产品推荐
相关产品推荐

