我正在尝试做openGLbook.com教程。我得到了这个常见的错误:
1>------ Build started: Project: OpenGL Startup, Configuration: Debug Win32 ------
1>Build started 1/25/2013 8:18:16 PM.
1>InitializeBuildStatus:
1> Touching "Debug\OpenGL Startup.unsuccessfulbuild".
1>ClCompile:
1> All outputs are up-to-date.
1>ManifestResourceCompile:
1> All outputs are up-to-date.
1>main.obj : error LNK2019: unresolved external symbol __imp__glewGetErrorString@4 referenced in function _Initialize
1>main.obj : error LNK2019: unresolved external symbol __imp__glewInit@0 referenced in function _Initialize
1>J:\Coding Projects\OpenGL 3.3 Tutorial\OpenGL Startup\Debug\OpenGL Startup.exe : fatal error LNK1120: 2 unresolved externals
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:00.07
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========我已经从glew.sourceforge.net下载了GLEW的最新64位二进制文件,并将它们复制到C:\Program Files (x86)\Microsoft \Windowsv7.0A中的相应位置。我还下载了最新的freeglut文件,并做了同样的事情。
我使用的是VS2010。以下是我更改的设置(基于其他帖子和论坛):
1)属性> VC++目录........添加了包含glew.h和freeglut.h的include文件夹
2)属性>链接器>输入>附加依赖关系.....新增glew32.lib、freeglut.lib、glew32mx.lib、glew32mxs.lib、glew32s.lib
我真的不明白为什么它仍然没有正确地链接这些库。我还应该注意到,我使用的是与C驱动器不同的驱动器。即使我将所有内容都链接到属性中的相应文件夹,这是否会产生影响?
编辑:忘记发布实际代码,如下所示:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <GL/glew.h>
#include <GL/freeglut.h>
#define WINDOW_TITLE_PREFIX "Chapter 1"
int CurrentWidth = 800,
CurrentHeight = 600,
WindowHandle = 0;
unsigned FrameCount = 0;
void Initialize(int, char*[]);
void InitWindow(int, char*[]);
void ResizeFunction(int, int);
void RenderFunction(void);
void TimerFunction(int);
void IdleFunction(void);
int main(int argc, char* argv[])
{
Initialize(argc, argv);
glutMainLoop();
exit(EXIT_SUCCESS);
}
void Initialize(int argc, char* argv[])
{
GLenum GlewInitResult;
InitWindow(argc, argv);
GlewInitResult = glewInit();
if (GLEW_OK != GlewInitResult) {
fprintf(
stderr,
"ERROR: %s\n",
glewGetErrorString(GlewInitResult)
);
}
fprintf(
stdout,
"INFO: OpenGL Version: %s\n",
glGetString(GL_VERSION)
);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
}
void InitWindow(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitContextVersion(4, 0);
glutInitContextFlags(GLUT_FORWARD_COMPATIBLE);
glutInitContextProfile(GLUT_CORE_PROFILE);
glutSetOption(
GLUT_ACTION_ON_WINDOW_CLOSE,
GLUT_ACTION_GLUTMAINLOOP_RETURNS
);
glutInitWindowSize(CurrentWidth, CurrentHeight);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
WindowHandle = glutCreateWindow(WINDOW_TITLE_PREFIX);
if(WindowHandle < 1) {
fprintf(
stderr,
"ERROR: Could not create a new rendering window.\n"
);
exit(EXIT_FAILURE);
}
glutReshapeFunc(ResizeFunction);
glutDisplayFunc(RenderFunction);
glutIdleFunc(IdleFunction);
glutTimerFunc(0, TimerFunction, 0);
}
void ResizeFunction(int Width, int Height)
{
CurrentWidth = Width;
CurrentHeight = Height;
glViewport(0, 0, CurrentWidth, CurrentHeight);
}
void RenderFunction(void)
{
++FrameCount;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSwapBuffers();
glutPostRedisplay();
}
void IdleFunction(void)
{
glutPostRedisplay();
}
void TimerFunction(int Value)
{
if (0 != Value) {
char* TempString = (char*)
malloc(512 + strlen(WINDOW_TITLE_PREFIX));
sprintf(
TempString,
"%s: %d Frames Per Second @ %d x %d",
WINDOW_TITLE_PREFIX,
FrameCount * 4,
CurrentWidth,
CurrentHeight
);
glutSetWindowTitle(TempString);
free(TempString);
}
FrameCount = 0;
glutTimerFunc(250, TimerFunction, 1);
}发布于 2013-02-14 11:00:02
如果你已经弄清楚了,我很抱歉。我也没有花时间通读评论。但是,您链接到的是静态库glew32s.lib,但是您的代码顶部没有包含#define GLEW_STATIC。
试试看。我很确定这就是你的问题。我尝试在我的代码中注释掉这一行,但得到了类似的错误。
发布于 2013-01-26 23:09:36
嗯,MS编译器会给出链接错误的原因很多。其一是,不要链接到你需要的库!有一个链接器选项(/VERBOSE),它列出了它试图链接时正在搜索的所有链接库。打开它,并确保它确实在搜索GLEW库。
另一种可能是您使用了错误的GLEW库。MS故意改变了编译器版本之间函数/方法名称的编码方式,因此您不能将VC++ 2008库链接到VC++ 2010编译的应用程序中。同样,您不能将64位库链接到32位构建中。您将收到"unresolved symbol“错误,如下所示。
你可以“解开”你看到的“损坏”的名字:_imp_glewGetErrorString@4
并根据额外的下划线等判断它是64位还是32位的库。
http://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B_Name_Mangling
但这对初学者来说很难。
我的猜测是,您没有链接到您认为自己是的库。
发布于 2013-12-09 18:29:22
我最近才遇到这个问题。我正在运行Windows8,使用VSExpress2012编译GLEW程序(我是第一次接触这个集成开发环境,因为我已经使用VC++ 6.0很长时间了)。这个问题通常是由于DLL文件丢失造成的,我通过将glew32.dll从<Glew_HOME>\bin\Release\Win32 (而不是x64版本)复制到C:\Windows\SysWOW64目录来解决它。如果我知道如何静态地将DLL资源与EXE链接起来,这样我就不再需要依赖系统资源,这是最好的。
https://stackoverflow.com/questions/14532917
复制相似问题