2010-11-08 6 views
4

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; 
} 

Répondre

4

D'accord, voici la réponse:

je devais ajouter les commandes suivantes:

#pragma (lib, "freeglut_static.lib") 
#pragma (lib, "gltools.lib") 

après avoir mis dans la bibliothèque chemin des fichiers nécessaires dans les répertoires du projet. Après cela, j'ai également besoin d'inclure glut32.dll dans mon répertoire de solution (comme j'avais également lié à Glut32), puis cela a fonctionné.

Espérons que cela aide quelqu'un!

3

Pour référence ultérieure, vous devez fournir les noms des bibliothèques que vous souhaitez lier à l'étape de l'éditeur de liens.

Dans Visual Studio par exemple, vous trouverez cette sous

Project Properties->Linker->Input 

Il suffit de les ajouter ';' délimité dans le champ "Dépendances supplémentaires".Personnellement, j'aime la solution de commentaires #pragma, mais comme vous n'avez pas besoin de vous rappeler d'ajouter les .libs sous des dépendances supplémentaires, vous avez juste besoin de ces instructions #pragma quelque part.