J'essaie actuellement de décider entre DirectX et OpenGL en programmant un peu DirectX 10 et OpenGL 3.3. J'ai déjà la configuration pour DirectX terminé, il était assez facile de lier et de compiler. OpenGl est ... plus difficile.Erreur de lien lors d'OpenGL: Tutoriel SuperBible
L'OpenGL Superbible a un exemple de début appelé Triangle.cpp dans lequel nous lions deux bibliothèques freeglut_static.lib
et GLTools.lib
. Ce n'est pas un problème. Je suis également allé dans les répertoires du projet et j'ai inclus le chemin Include/et lib/de toutes les extensions OpenGL nécessaires (GLEE, Glew, Glut, FreeGlut, GLTools-damn, est-ce suffisant?).
D'abord, j'ai eu plusieurs erreurs de liens, parce que ma génération de code a été définie sur DLL, pas statique. J'ai corrigé ceci et ai également ajouté LIBC.lib
à la liste des bibliothèques ignorées dans le lieur (pas sûr si placer la génération de code à statique a corrigé ceci aussi bien).
Maintenant, il me reste deux erreurs de l'éditeur de liens reste que je ne peux pas me débarrasser de:
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
Je fouillé ce problème sur google, et beaucoup de gens ont commenté la nature statique du programme (que je fixe) ainsi qu'un problème particulier avec une version conflictuelle entre Glut.h et Glut.lib. Cependant, j'ai même utilisé une ancienne version de Glut (3.6) et l'erreur de l'éditeur de liens subsiste.
D'autres recherches dans google ne proposent pas vraiment quelque chose de raisonnable pour travailler avec. Donc, je demande ici: Comment puis-je résoudre ce problème?
Infos
génération de code: Multithreaded
C++ préprocesseur Commande: FREEGLUT_STATIC
IDE: Visual Studio 2008 and 2010. (Testing on both- same error on both)
Bibliothèques: Ignoré LIBC.lib
Code Triangle.cpp (un simple copier/coller du code dans le livre):
// 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;
}