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

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下的文件)
  • Debug模式下,GLEW需链接glew32d.lib,Release模式链接glew32.lib,避免版本混淆。

4. 代码中添加必要的宏定义

如果使用静态库,需在包含GLEW头文件前定义GLEW_STATIC,确保编译器正确识别静态库符号:

#define GLEW_STATIC
#include <GL/glew.h>

内容的提问来源于stack exchange,提问作者Ziad Abdelrahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:05:57