提问人:IAE 提问时间:11/8/2010 更新时间:11/8/2010 访问量:3020
OpenGL 期间的链接器错误:SuperBible 教程
Linker Error During OpenGL: SuperBible Tutorial
问:
我目前正在尝试通过编写一些 DirectX 10 和 OpenGL 3.3 来在 DirectX 和 OpenGL 之间做出决定。我已经完成了DirectX的设置,链接和编译相当容易。OpenGl 是...难。
OpenGL Superbible有一个称为Triangle.cpp的初始示例,其中我们链接了两个库和.这不是问题;我还访问了项目目录,并包含了所有必要的 OpenGL 扩展(GLEE、Glew、Glut、FreeGlut、GLTools)的 Include/ 和 lib/ 路径——该死的,够了吗?freeglut_static.lib
GLTools.lib
首先,我遇到了几个链接器错误,因为我的代码生成是在 DLL 上设置的,而不是在 Static 上设置的。我已经修复了这个问题,并且还添加到链接器中被忽略的库列表中(不确定将代码生成设置为静态是否也解决了这个问题)。LIBC.lib
现在我还剩下两个链接器错误,我无法摆脱:
1>Triangle.obj : error LNK2019: unresolved external symbol ___glutInitWithExit referenced in function _glutInit_ATEXIT_HACK
1>Triangle.obj : error LNK2019: unresolved external symbol ___glutCreateWindowWithExit referenced in function _glutCreateWindow_ATEXIT_HACK
我在谷歌上搜索了这个问题,很多人评论了程序的静态性质(我已经修复了),以及 Glut.h 和 Glut.lib 之间版本冲突的特定问题。但是,我什至使用了旧版本的 Glut (3.6),链接器错误仍然存在。
谷歌中的其他搜索并没有真正想出任何合理的方法。所以,我在这里问:我该如何解决这个问题?
信息
代码生成:Multithreaded
C++ 预处理器命令:FREEGLUT_STATIC
集成开发环境:Visual Studio 2008 and 2010. (Testing on both- same error on both)
忽略的库:LIBC.lib
三角形.cpp代码(从书中的代码中简单复制/粘贴):
// Triangle.cpp
// Our first OpenGL program that will just draw a triangle on the screen.
#include <GLTools.h> // OpenGL toolkit
#include <GLShaderManager.h> // Shader Manager Class
//#define FREEGLUT_STATIC
#include <GL/glut.h> // Windows FreeGlut equivalent
GLBatch triangleBatch;
GLShaderManager shaderManager;
///////////////////////////////////////////////////////////////////////////////
// Window has changed size, or has just been created. In either case, we need
// to use the window dimensions to set the viewport and the projection matrix.
void ChangeSize(int w, int h)
{
glViewport(0, 0, w, h);
}
///////////////////////////////////////////////////////////////////////////////
// This function does any needed initialization on the rendering context.
// This is the first opportunity to do any OpenGL related tasks.
void SetupRC()
{
// Blue background
glClearColor(0.0f, 0.0f, 1.0f, 1.0f );
shaderManager.InitializeStockShaders();
// Load up a triangle
GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f,
0.5f, 0.0f, 0.0f,
0.0f, 0.5f, 0.0f };
triangleBatch.Begin(GL_TRIANGLES, 3);
triangleBatch.CopyVertexData3f(vVerts);
triangleBatch.End();
}
///////////////////////////////////////////////////////////////////////////////
// Called to draw scene
void RenderScene(void)
{
// Clear the window with current clearing color
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
triangleBatch.Draw();
// Perform the buffer swap to display the back buffer
glutSwapBuffers();
}
///////////////////////////////////////////////////////////////////////////////
// Main entry point for GLUT based programs
int main(int argc, char* argv[])
{
gltSetWorkingDirectory(argv[0]);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
glutInitWindowSize(800, 600);
glutCreateWindow("Triangle");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
GLenum err = glewInit();
if (GLEW_OK != err) {
fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
return 1;
}
SetupRC();
glutMainLoop();
return 0;
}
答:
好的,这是答案:
我必须添加以下命令:
#pragma (lib, "freeglut_static.lib")
#pragma (lib, "gltools.lib")
在项目目录中输入所需文件的库路径后。之后,我还需要在我的解决方案目录中包含glut32.dll(因为我也链接到了Glut32),然后它就可以工作了。
希望这对某人有所帮助!
为了将来参考,您需要在链接器阶段提供要链接的库的名称。
例如,在 Visual Studio 中,你可以在
Project Properties->Linker->Input
只需在“其他依赖项”字段中添加以“;”分隔的“;”即可。
就我个人而言,我喜欢 #pragma 注释解决方案,因为您不需要记住在额外的依赖项下添加 .libs,您只需要在某处添加这些 #pragma 语句即可。
评论