OpenGL błędy kompilacji

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
mazix2
Sędziwy Jeż
Sędziwy Jeż
Posty: 75
Rejestracja: 11 gru 2009, 10:01
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86

OpenGL błędy kompilacji

Post autor: mazix2 »

Używam Ubuntu 10.10 i chciałem zacząć coś pisać w OpenGL i GLUT. Poinstalowałem wszystko tak:

1.Code::Blocks (potem go nie używałem, bo nie kompilował, ale może to ważne, że go mam)
2.sudo apt-get install libgl1-mesa-dev
3.sudo apt-get install freeglut3
4.sudo apt-get install freeglut3-dev


Mam przykładowy kod, znaleziony gdzieś w sieci, bo OpenGL jeszcze;) nie umiem:

Kod: Zaznacz cały

#include <GL/freeglut.h>
 
#define window_width  640
#define window_height 480
 
// Main loop
void main_loop_function()
{
   // Z angle
   static float angle;
   // Clear color (screen) 
   // And depth (used internally to block obstructed objects)
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   // Load identity matrix
   glLoadIdentity();
   // Multiply in translation matrix
   glTranslatef(0,0, -10);
   // Multiply in rotation matrix
   glRotatef(angle, 0, 0, 1);
   // Render colored quad
   glBegin(GL_QUADS);
   glColor3ub(255, 000, 000); glVertex2f(-1,  1);
   glColor3ub(000, 255, 000); glVertex2f( 1,  1);
   glColor3ub(000, 000, 255); glVertex2f( 1, -1);
   glColor3ub(255, 255, 000); glVertex2f(-1, -1);
   glEnd();
   // Swap buffers (color buffers, makes previous render visible)
        glutSwapBuffers();
   // Increase angle to rotate
   angle+=0.25;
}
 
// Initialze OpenGL perspective matrix
void GL_Setup(int width, int height)
{
 
        glViewport( 0, 0, width, height );
        glMatrixMode( GL_PROJECTION );
        glEnable( GL_DEPTH_TEST );
        gluPerspective( 45, (float)width/height, .1, 100 );
        glMatrixMode( GL_MODELVIEW );
}
 
 
// Initialize GLUT and start main loop
int main(int argc, char** argv) {
        glutInit(&argc, argv);
 
        glutInitWindowSize(window_width, window_height);
 
        glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
 
        glutCreateWindow("GLUT Example!!!");
 
        glutIdleFunc(main_loop_function);
 
        GL_Setup(window_width, window_height);
   glutMainLoop();
 
}
Kompilowałem różnymi sposobami:

Kod: Zaznacz cały

mazix@komputer:~/Pulpit$ g++ glut_file.cpp -lglut
/tmp/cc1Tjtuh.o: In function `GL_Setup(int, int)':
glut_file.cpp:(.text+0x1bc): undefined reference to `gluPerspective'
collect2: ld returned 1 exit status

mazix@komputer:~/Pulpit$ g++ glut_file.cpp -lglu
/usr/bin/ld: cannot find -lglu
collect2: ld returned 1 exit status

mazix@komputer:~/Pulpit$ g++ glut_file.cpp -lgl
/usr/bin/ld: cannot find -lgl
collect2: ld returned 1 exit status

mazix@komputer:~/Pulpit$ g++ glut_file.cpp -lfreeglut
/usr/bin/ld: cannot find -lfreeglut
collect2: ld returned 1 exit status

mazix@komputer:~/Pulpit$ g++ glut_file.cpp -lfreeglut -lGLU -lGL
/usr/bin/ld: cannot find -lfreeglut
collect2: ld returned 1 exit status

mazix@komputer:~/Pulpit$ g++ glut_file.cpp -lGLU -lGL
/tmp/cctkri3t.o: In function `main_loop_function()':
glut_file.cpp:(.text+0x138): undefined reference to `glutSwapBuffers'
/tmp/cctkri3t.o: In function `main':
glut_file.cpp:(.text+0x1e5): undefined reference to `glutInit'
glut_file.cpp:(.text+0x1f9): undefined reference to `glutInitWindowSize'
glut_file.cpp:(.text+0x205): undefined reference to `glutInitDisplayMode'
glut_file.cpp:(.text+0x211): undefined reference to `glutCreateWindow'
glut_file.cpp:(.text+0x21d): undefined reference to `glutIdleFunc'
glut_file.cpp:(.text+0x236): undefined reference to `glutMainLoop'
collect2: ld returned 1 exit status
Proszę o pomoc, bo nawet nie mam jak zacząć nauki, bo nic nie idzie skompilować :(
luzakwielki
Wytworny Kaczor
Wytworny Kaczor
Posty: 264
Rejestracja: 19 lis 2008, 11:42
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86_64

Re: OpenGL błędy kompilacji

Post autor: luzakwielki »

Wielkość liter ma znaczenie

Kod: Zaznacz cały

g++ glut_file.cpp -lGL -lGLU -lglut
Nie masz przecież plików libgl.so i libglu.so w /usr/lib tylko libGL.so i libGLU.so
mazix2
Sędziwy Jeż
Sędziwy Jeż
Posty: 75
Rejestracja: 11 gru 2009, 10:01
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86

Re: OpenGL błędy kompilacji

Post autor: mazix2 »

Dzięki piękne, działa:) A wiesz może jak ustawić to w Code::Blocks, żeby działało? Bo teraz tworzę Nowy->Projekt->Projekt OpenGL, lokalizację GLUTa daję /usr, pokazuje mi się w Code::Blocks przykladowy kod, daję F9, ale dostaję błąd:

Kod: Zaznacz cały

||=== projekt, Debug ===|
ld||cannot find -lXxf86vm|
||=== Build finished: 1 errors, 0 warnings ===|
Jak kompiluję "normalnie", za pomocą opcji, które podałeś, z konsoli, to wszystko pięknie działa.

I kolejne pytanie: wszędzie są kursy OpenGL pod Windows. Zna ktoś może jakiś kurs OpenGL pod Ubuntu? Nie musi być po polsku, może być w j.angielskim, byle by jakiś był;)
luzakwielki
Wytworny Kaczor
Wytworny Kaczor
Posty: 264
Rejestracja: 19 lis 2008, 11:42
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86_64

Re: OpenGL błędy kompilacji

Post autor: luzakwielki »

mazix2 pisze:Dzięki piękne, działa:) A wiesz może jak ustawić to w Code::Blocks, żeby działało? Bo teraz tworzę Nowy->Projekt->Projekt OpenGL, lokalizację GLUTa daję /usr, pokazuje mi się w Code::Blocks przykladowy kod, daję F9, ale dostaję błąd:

Kod: Zaznacz cały

||=== projekt, Debug ===|
ld||cannot find -lXxf86vm|
||=== Build finished: 1 errors, 0 warnings ===|
Jak kompiluję "normalnie", za pomocą opcji, które podałeś, z konsoli, to wszystko pięknie działa.
Nie używam C::B (korzystam z Eclipse) i nie ufam kreatorom (sam lepiej powinieneś wiedzieć jakie biblioteki chcesz używać i gdzie są), ale twój błąd to zapewne brak pakietu libxxf86vm-dev (cannot find -lXxf86vm), lub usuń z bibliotek z którymi linkuje standardowo projekt (bo zapewne nie jest potrzebna)
mazix2 pisze:I kolejne pytanie: wszędzie są kursy OpenGL pod Windows. Zna ktoś może jakiś kurs OpenGL pod Ubuntu? Nie musi być po polsku, może być w j.angielskim, byle by jakiś był;)
Większość kursów OpenGL jest przestarzała - te które są w miarę aktualne są wieloplatformowe (z wykorzystaniem GLFW lub SDL). Jednak możesz się nawet uczyć z kursów pod Windowsa, bo praktycznie poza stworzeniem okna (co zrobiłeś za pomocą GLUT) wszystko jest w nich tak samo (OpenGL jest ten sam), a jeśli będziesz chciał użyć (w raczej dalszej przyszłości) jakiegoś rozszerzenia Windows Only (wgl*) to praktycznie każde rozszerzenie ma wersję dla Xów (funkcje zamiast zaczynać się od wgl* zaczynają się od glX*).
mazix2
Sędziwy Jeż
Sędziwy Jeż
Posty: 75
Rejestracja: 11 gru 2009, 10:01
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86

Re: OpenGL błędy kompilacji

Post autor: mazix2 »

Ok, najwyżej dam sobie spokój z Code::Blocks... Jednak pojawił sie nowy problem... Ściągnąłem kod z kursu Nehe, tą wersję GLUT, oto kod:

Kod: Zaznacz cały

/*
When creating your project, uncheck OWL,
uncheck Class Library, select Static
instead of Dynamic and change the target
model to Console from GUI.
Also link glut.lib to your project once its done.
*/

//#include <windows.h>   // Standard Header For Most Programs
#include <gl/gl.h>     // The GL Header File
#include <gl/glut.h>   // The GL Utility Toolkit (Glut) Header

void init ( GLvoid )     // Create Some Everyday Functions
{

  glShadeModel(GL_SMOOTH);							// Enable Smooth Shading
	glClearColor(0.0f, 0.0f, 0.0f, 0.5f);				// Black Background
	glClearDepth(1.0f);									// Depth Buffer Setup
	glEnable(GL_DEPTH_TEST);							// Enables Depth Testing
	glDepthFunc(GL_LEQUAL);								// The Type Of Depth Testing To Do
   glEnable ( GL_COLOR_MATERIAL );
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

void display ( void )   // Create The Display Function
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	// Clear Screen And Depth Buffer
	glLoadIdentity();									// Reset The Current Modelview Matrix
	glTranslatef(-1.5f,0.0f,-6.0f);						// Move Left 1.5 Units And Into The Screen 6.0
	glBegin(GL_TRIANGLES);								// Drawing Using Triangles
		glVertex3f( 0.0f, 1.0f, 0.0f);					// Top
		glVertex3f(-1.0f,-1.0f, 0.0f);					// Bottom Left
		glVertex3f( 1.0f,-1.0f, 0.0f);					// Bottom Right
	glEnd();											// Finished Drawing The Triangle
	glTranslatef(3.0f,0.0f,0.0f);						// Move Right 3 Units
	glBegin(GL_QUADS);									// Draw A Quad
		glVertex3f(-1.0f, 1.0f, 0.0f);					// Top Left
		glVertex3f( 1.0f, 1.0f, 0.0f);					// Top Right
		glVertex3f( 1.0f,-1.0f, 0.0f);					// Bottom Right
		glVertex3f(-1.0f,-1.0f, 0.0f);					// Bottom Left
	glEnd();


  glutSwapBuffers ( );
  // Swap The Buffers To Not Be Left With A Clear Screen
}

void reshape ( int w, int h )   // Create The Reshape Function (the viewport)
{
  glViewport     ( 0, 0, w, h );
  glMatrixMode   ( GL_PROJECTION );  // Select The Projection Matrix
  glLoadIdentity ( );                // Reset The Projection Matrix
  if ( h==0 )  // Calculate The Aspect Ratio Of The Window
     gluPerspective ( 80, ( float ) w, 1.0, 5000.0 );
  else
     gluPerspective ( 80, ( float ) w / ( float ) h, 1.0, 5000.0 );
  glMatrixMode   ( GL_MODELVIEW );  // Select The Model View Matrix
  glLoadIdentity ( );    // Reset The Model View Matrix
}

void keyboard ( unsigned char key, int x, int y )  // Create Keyboard Function
{
  switch ( key ) {
    case 27:        // When Escape Is Pressed...
      exit ( 0 );   // Exit The Program
      break;        // Ready For Next Case
    default:        // Now Wrap It Up
      break;
  }
}

void arrow_keys ( int a_keys, int x, int y )  // Create Special Function (required for arrow keys)
{
  switch ( a_keys ) {
    case GLUT_KEY_UP:     // When Up Arrow Is Pressed...
      glutFullScreen ( ); // Go Into Full Screen Mode
      break;
    case GLUT_KEY_DOWN:               // When Down Arrow Is Pressed...
      glutReshapeWindow ( 500, 500 ); // Go Into A 500 By 500 Window
      break;
    default:
      break;
  }
}

void main ( int argc, char** argv )   // Create Main Function For Bringing It All Together
{
  glutInit            ( &argc, argv ); // Erm Just Write It =)
  init ();
  glutInitDisplayMode ( GLUT_RGB | GLUT_DOUBLE ); // Display Mode
  glutInitWindowSize  ( 500, 500 ); // If glutFullScreen wasn't called this is the window size
  glutCreateWindow    ( "NeHe's OpenGL Framework" ); // Window Title (argv[0] for current directory as title)
  glutFullScreen      ( );          // Put Into Full Screen
  glutDisplayFunc     ( display );  // Matching Earlier Functions To Their Counterparts
  glutReshapeFunc     ( reshape );
  glutKeyboardFunc    ( keyboard );
  glutSpecialFunc     ( arrow_keys );
  glutMainLoop        ( );          // Initialize The Main Loop
}

Nic nie zmieniałem,zakomentowałem tylko includowanie windows.h, ale wywala mi błędy:

Kod: Zaznacz cały

mazix@komputer:~/Pulpit/Temp$ g++ lesson2.cpp -lGL -lGLU -lglut
lesson2.cpp:10: fatal error: gl/gl.h: Nie ma takiego pliku ani katalogu
compilation terminated.
mazix@komputer:~/Pulpit/Temp$
Co jest nie tak?

W momencie, kiedy zamienię

Kod: Zaznacz cały

#include <gl/gl.h>     // The GL Header File
#include <gl/glut.h>   // The GL Utility Toolkit (Glut) Header
na

Kod: Zaznacz cały

#include <GL/gl.h>     // The GL Header File
#include <GL/freeglut.h>   // The GL Utility Toolkit (Glut) Header
blędy są takie;

Kod: Zaznacz cały

mazix@komputer:~/Pulpit/Temp$ g++ lesson2.cpp -lGL -lGLU -lglut
lesson2.cpp:13: error: ‘<anonymous>’ has incomplete type
lesson2.cpp:13: error: invalid use of ‘GLvoid’
lesson2.cpp:86: error: ‘::main’ must return ‘int’
lesson2.cpp: In function ‘int main(int, char**)’:
lesson2.cpp:13: error: too few arguments to function ‘void init(<type error>)’
lesson2.cpp:89: error: at this point in file
mazix@komputer:~/Pulpit/Temp$ 
-- 08 paź 2011 19:57 --

ok, juz wiem co było źle:) zmieniłem te nagłówki, usunąłem GLvoid tam, gdzie krzyczało, void main zmieniłem na int main i działa;)
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 10 gości