PDA

View Full Version : Need Help with openGL Bouncing box linker error!



Me6
06-16-2004, 01:25 PM
Here is the compiling process and errors:


C:\Dev-Cpp\bin>gcc.exe c:\Dev-Cpp\OGLSource.c -opengl32
C:\DOCUME~1\Fred\LOCALS~1\Temp/ccAVbaaa.o(.text+0x9f):OGLSource.c: undefined ref
erence to `CreateSolidBrush@4'
C:\DOCUME~1\Fred\LOCALS~1\Temp/ccAVbaaa.o(.text+0xb2):OGLSource.c: undefined ref
erence to `CreateSolidBrush@4'
C:\DOCUME~1\Fred\LOCALS~1\Temp/ccAVbaaa.o(.text+0x1b9):OGLSource.c: undefined re
ference to `ChangeSize'
C:\DOCUME~1\Fred\LOCALS~1\Temp/ccAVbaaa.o(.text+0x1c3):OGLSource.c: undefined re
ference to `IdleFunction'
C:\DOCUME~1\Fred\LOCALS~1\Temp/ccAVbaaa.o(.text+0x1dc):OGLSource.c: undefined re
ference to `RenderScene'
C:\DOCUME~1\Fred\LOCALS~1\Temp/ccAVbaaa.o(.text+0x1ea):OGLSource.c: undefined re
ference to `SwapBuffers@4'

C:\Dev-Cpp\bin>Here is my code:


/* Creation of a simple Windows API program */

#include <windows.h>
#include <gl/gl.h>

/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/* Make the class name into a global variable */
char szClassName[ ] = "WindowsApp";


int WINAPI
WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)


{
HWND hwnd; /* This is the handle for our window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */

/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);

/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
wincl.cbWndExtra = 0; /* structure or the window instance */
/* Use Windows's default color as the background of the window */
// Create a blue and red brush for drawing and filling
// operations. // Red, green, blue

HBRUSH hBlueBrush,hRedBrush;

hBlueBrush = CreateSolidBrush(RGB( 0, 0, 255));
hRedBrush = CreateSolidBrush(RGB( 255, 0, 0));

wincl.hbrBackground = hBlueBrush; // Use blue brush for background



/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&amp;wincl))
return 0;

/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
"Trying to do opengl stuff", /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
544, /* The programs width */
375, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);

/* Make the window visible on the screen */
ShowWindow (hwnd, nFunsterStil);



/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&amp;messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&amp;messages);
/* Send message to WindowProcedure */
DispatchMessage(&amp;messages);
}

/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}

// Create a timer that fires every millisecond
//SetTimer(hWnd,101,1,NULL);

/* This function is called by the Windows function DispatchMessage() */

LRESULT CALLBACK
WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HGLRC hRC; // Permanent Rendering context
static HDC hDC; // Private GDI Device context
switch (message) /* handle the messages */
{
// Window is resized.
case WM_SIZE:
// Call our function which modifies the clipping
// volume and viewport
ChangeSize(LOWORD(lParam), HIWORD(lParam));
break;

case WM_TIMER:
{
IdleFunction();
InvalidateRect(hwnd,NULL,FALSE);
}
break;
case WM_PAINT:
{
// Call OpenGL drawing code
RenderScene();
// Call function to swap the buf fers
SwapBuffers(hDC);
// Validate the newly painted client area
ValidateRect(hwnd,NULL);
}
break;
case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}

return 0;
}What did I do wrong? Thanks... Me6 :confused:

mikael_aronsson
06-18-2004, 04:05 AM
Hi !

You have not included the libraries neeed to link your application.

For example CreateSolidBrush is found in gdi32.dll so you need to tell the linker where that function is found.

If I remember correct you don't need to give all the win32 api libraries if you give the right option to gcc, I think it is -mwindows or something like that.

You also need to include -lopengl32 and maybe -lglu32 to make sure you link with the OpenGL libraries.

Sorry, I don't have any gcc installed at the moment so I cannot give more exact info then that.

Mikael

Me6
06-18-2004, 12:31 PM
Thanks... I had used some libs like opengl and glu, but I might not have put them in. I will try itwith those libs.

Me6
06-18-2004, 01:16 PM
I tried it agian with the libs:


C:\mingw\bin>gcc.exe c:\Dev-Cpp\OGLSource.c -mwindows -lopengl32 -lglu32 -lgdi32

C:\DOCUME~1\Fred\LOCALS~1\Temp/ccGUbaaa.o(.text+0x1b8):OGLSource.c: undefined re
ference to `ChangeSize'
C:\DOCUME~1\Fred\LOCALS~1\Temp/ccGUbaaa.o(.text+0x1c2):OGLSource.c: undefined re
ference to `IdleFunction'
C:\DOCUME~1\Fred\LOCALS~1\Temp/ccGUbaaa.o(.text+0x1db):OGLSource.c: undefined re
ference to `RenderScene'

C:\mingw\bin>

RAW
06-18-2004, 09:23 PM
"ChangeSize", "IdleFunction" and "RenderScene" are apparently internal functions from another C file.

OpenGL functions start with "gl". There are no OpenGL functions in this source file. All the OpenGL specific code is not in the "OGLSource.c" file you have shown us. This is really just a Win32 program. All the OpenGL work seems to happen in your "RenderScene" function.

The other functions "CreateSolidBrush" and "SwapBuffers" are defined in OpenGL32.lib and Gdi32.lib respectively. "SwapBuffers" is a Microsoft function, defined in WGL, and is not part of the OpenGL spec.

So, you need to link in your other compiled source objects ( .o files or .lib files ) that define the functions such as "RenderScene" in order to get a successful build.

Check out NeHe\'s Tutorials (http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=01) for a working, compilable, tutorial. I'm sure you'll have much more success.