如何从项目目录链接GLEW解决未解析外部符号,实现项目可移植?
我之前也踩过这个一模一样的坑,为了项目可移植性不想依赖系统安装的GLEW,结果折腾半天一直报unresolved external symbol,后来把几个核心关键点捋一遍就解决了。给你一步步来排查:
首先要把GLEW的文件放在项目目录里的固定位置,比如创建一个ThirdParty/GLEW文件夹,里面分成:
include/GL:放glew.h、wglew.h这些头文件lib/x86和lib/x64:分别放对应32位、64位的库文件(比如glew32.lib、glew32s.lib)- 动态链接用的
glew32.dll也放在对应平台的文件夹里(比如bin/x64)
这样用相对路径配置的时候才不会乱,也方便项目打包给其他人。
别偷懒只设置一个配置,不同配置的路径和依赖可能不一样,这也是常见的错误来源。
1. 配置包含目录
打开项目属性(右键项目→属性),找到C/C++ → 常规 → 附加包含目录,添加相对路径:
$(ProjectDir)ThirdParty/GLEW/include
$(ProjectDir)是VS内置的宏,代表当前项目的根目录,用这个比写绝对路径靠谱多了,保证项目移到别的电脑也能正常识别。
2. 配置库目录
找到链接器 → 常规 → 附加库目录,添加对应平台的库路径,比如你用x64的话就加:
$(ProjectDir)ThirdParty/GLEW/lib/x64
如果是x86就换成lib/x86,一定要和当前项目的平台匹配!
3. 配置链接器输入
找到链接器 → 输入 → 附加依赖项,这里分两种情况:
- 如果用动态链接(需要带.dll文件):添加
glew32.lib - 如果用静态链接(不需要.dll,编译进可执行文件):添加
glew32s.lib,同时必须去C/C++ → 预处理器 → 预处理器定义里加上GLEW_STATIC!这一步绝对不能忘,静态链接GLEW必须定义这个宏,不然肯定会报未解析符号。
打开配置管理器(项目属性页左上角的下拉框里找),确认:
- 活动解决方案平台(比如x64)和你链接的GLEW库平台一致
- 当前项目的平台设置和解决方案平台一致
比如你项目设的是x64,但链接的是x86的GLEW库,那肯定会出现未解析符号,因为32位和64位的库不能混用。
如果用的是动态链接(glew32.lib),必须把对应的glew32.dll复制到项目的输出目录(比如x64/Debug或者x64/Release)里。为了自动化,你可以:
- 右键项目→添加→现有项,选中
ThirdParty/GLEW/bin/x64/glew32.dll - 选中添加进来的.dll文件,在属性里设置复制到输出目录为如果较新则复制
这样每次编译时VS都会自动把最新的.dll复制过去,不用手动拷贝,也保证了项目的可移植性。
代码里一定要先包含glew.h,再包含其他OpenGL相关的头文件(比如gl.h、glut.h、glfw.h),比如:
#include <GL/glew.h> #include <GLFW/glfw3.h> // 或者其他OpenGL库的头文件
如果顺序反了,GLEW没法正确替换OpenGL的函数指针,也会导致未解析符号的问题。
按照上面的步骤一步步检查,应该就能解决你的问题了,我当时就是漏了静态链接的GLEW_STATIC宏和平台不匹配的问题,改完就正常了。
内容的提问来源于stack exchange,提问作者meph

