Skip to main content
GameDev.net gamedev.net
🔒 Locked

Linker errors

Started by peter86 Jan 31, 2003 at 3:37 AM 14 replies 1.9k views
Original Post
peter86
peter86
I''m getting these linker errors using Dev-C++: [Linker error] undefined reference to `Direct3DCreate8@4'' [Linker error] undefined reference to `D3DXMatrixRotationY@8'' [Linker error] undefined reference to `D3DXMatrixLookAtLH@16'' [Linker error] undefined reference to `D3DXMatrixPerspectiveFovLH@20'' What''s wrong?
Pipo DeClown
Pipo DeClown
#pragma comment( lib, "dxguid.lib" )
#pragma comment( lib, "d3d8.lib" ) // "d3d9.lib if youre using dx9

probably... maybe... could be... this =)
peter86
peter86
I added those line, but now I'm getting these warnings instead:

In file included from test.cpp:13:
mmsystem.h:21: warning: MAKEFOURCC' redefined
d3d8types.h:1224: warning: this is the location of the previous definition
test.cpp: In function
void SetupMatrices()':
test.cpp:149: warning: taking address of temporary
test.cpp:150: warning: taking address of temporary
test.cpp:151: warning: taking address of temporary

And it dosen't make a exe though there where zero errors. Why?

[edited by - peter86 on January 31, 2003 5:46:02 AM]
Pipo DeClown
Pipo DeClown
can you post all your code in [ s o u r c e ][ / s o u r c e ] tags?

.lick
peter86
peter86
Sure.


  
// include files ////////////////////////////////////////////////////////////


#include <d3dx8.h>
#include <mmsystem.h>
#pragma comment( lib, "dxguid.lib" )
#pragma comment( lib, "d3d8.lib" )

//-----------------------------------------------------------------------------

// Global variables

//-----------------------------------------------------------------------------

LPDIRECT3D8 g_pD3D = NULL; // Used to create the D3DDevice

LPDIRECT3DDEVICE8 g_pd3dDevice = NULL; // Our rendering device

LPDIRECT3DVERTEXBUFFER8 g_pVB = NULL; // Buffer to hold vertices


// A structure for our custom vertex type

struct CUSTOMVERTEX
{
FLOAT x, y, z; // The untransformed, 3D position for the vertex

DWORD color; // The vertex color

};

// Our custom FVF, which describes our custom vertex structure

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)




//-----------------------------------------------------------------------------

// Name: InitD3D()

// Desc: Initializes Direct3D

//-----------------------------------------------------------------------------

HRESULT InitD3D( HWND hWnd )
{
// Create the D3D object.

if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )
return E_FAIL;

// Get the current desktop display mode, so we can set up a back

// buffer of the same format

D3DDISPLAYMODE d3ddm;
if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
return E_FAIL;

// Set up the structure used to create the D3DDevice

D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = d3ddm.Format;

// Create the D3DDevice

if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
{
return E_FAIL;
}

// Turn off culling, so we see the front and back of the triangle

g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );

// Turn off D3D lighting, since we are providing our own vertex colors

g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );

return S_OK;
}




//-----------------------------------------------------------------------------

// Name: InitGeometry()

// Desc: Creates the scene geometry

//-----------------------------------------------------------------------------

HRESULT InitGeometry()
{
// Initialize three vertices for rendering a triangle

CUSTOMVERTEX g_Vertices[] =
{
{ -1.0f,-1.0f, 0.0f, 0xffff0000, },
{ 1.0f,-1.0f, 0.0f, 0xff0000ff, },
{ 0.0f, 1.0f, 0.0f, 0xffffffff, },
};

// Create the vertex buffer.

if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &g_pVB ) ) )
{
return E_FAIL;
}

// Fill the vertex buffer.

VOID* pVertices;
if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (BYTE**)&pVertices, 0 ) ) )
return E_FAIL;
memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
g_pVB->Unlock();

return S_OK;
}




//-----------------------------------------------------------------------------

// Name: Cleanup()

// Desc: Releases all previously initialized objects

//-----------------------------------------------------------------------------

VOID Cleanup()
{
if( g_pVB != NULL )
g_pVB->Release();

if( g_pd3dDevice != NULL )
g_pd3dDevice->Release();

if( g_pD3D != NULL )
g_pD3D->Release();
}



//-----------------------------------------------------------------------------

// Name: SetupMatrices()

// Desc: Sets up the world, view, and projection transform matrices.

//-----------------------------------------------------------------------------

VOID SetupMatrices()
{
// For our world matrix, we will just rotate the object about the y-axis.

D3DXMATRIX matWorld;
D3DXMatrixRotationY( &matWorld, timeGetTime()/150.0f );
g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );

// Set up our view matrix. A view matrix can be defined given an eye point,

// a point to lookat, and a direction for which way is up. Here, we set the

// eye five units back along the z-axis and up three units, look at the

// origin, and define "up" to be in the y-direction.

D3DXMATRIX matView;
D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3( 0.0f, 3.0f,-5.0f ),
&D3DXVECTOR3( 0.0f, 0.0f, 0.0f ),
&D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) );
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

// For the projection matrix, we set up a perspective transform (which

// transforms geometry from 3D view space to 2D viewport space, with

// a perspective divide making objects smaller in the distance). To build

// a perpsective transform, we need the field of view (1/4 pi is common),

// the aspect ratio, and the near and far clipping planes (which define at

// what distances geometry should be no longer be rendered).

D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
}



//-----------------------------------------------------------------------------

// Name: Render()

// Desc: Draws the scene

//-----------------------------------------------------------------------------

VOID Render()
{
// Clear the backbuffer to a black color

g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,128), 1.0f, 0 );

// Begin the scene

g_pd3dDevice->BeginScene();

// Setup the world, view, and projection matrices

SetupMatrices();

// Render the vertex buffer contents

g_pd3dDevice->SetStreamSource( 0, g_pVB, sizeof(CUSTOMVERTEX) );
g_pd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 1 );

// End the scene

g_pd3dDevice->EndScene();

// Present the backbuffer contents to the display

g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}




//-----------------------------------------------------------------------------

// Name: MsgProc()

// Desc: The window''s message handler

//-----------------------------------------------------------------------------

LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
PostQuitMessage( 0 );
return 0;
}

return DefWindowProc( hWnd, msg, wParam, lParam );
}




//-----------------------------------------------------------------------------

// Name: WinMain()

// Desc: The application''s entry point

//-----------------------------------------------------------------------------

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
// Register the window class

WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
"Ch6p2_FirstScene", NULL };
RegisterClassEx( &wc );

// Create the application''s window

HWND hWnd = CreateWindowEx(0, "MyCoolWindow", "My First Window",
WS_POPUP | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME,
50, 50, 200, 100, NULL, NULL, hInst, NULL);


// Initialize Direct3D

if( SUCCEEDED( InitD3D( hWnd ) ) )
{
// Create the scene geometry

if( SUCCEEDED( InitGeometry() ) )
{
// Show the window

ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );

// Enter the message loop

MSG msg;
ZeroMemory( &msg, sizeof(msg) );
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
Render();
}
}
}

// Clean up everything and exit the app

Cleanup();
return 0;
}
Pipo DeClown
Pipo DeClown
can you remove #include <mmsystem.h> ?

if you need mmsystem.h:

#pragma comment( lib, "winmm.lib" )

.lick
peter86
peter86
I need #include <mmsystem.h> for the timeGetTime().
Pipo DeClown
Pipo DeClown
quote:
Original post by Pipo DeClown
if you need mmsystem.h:

#pragma comment( lib, "winmm.lib" )

.lick




Have you used this?

.lick
peter86
peter86
quote:
Original post by Pipo DeClown
[quote]Original post by Pipo DeClown
if you need mmsystem.h:

#pragma comment( lib, "winmm.lib" )

.lick



Have you used this?

.lick


Of course, I tried but it didn't work.

[edited by - peter86 on January 31, 2003 6:44:09 AM]
Arkainium
Arkainium
I just posted a reply to this here. Check it out and tell me if you have any trouble.
Pipo DeClown
Pipo DeClown
// Create the D3DDevice
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
{
MessageBox( NULL, "D3D: CreateDevice", "Status", MB_OK );
return E_FAIL;
}


This function fails =)because the HWND is invalid, is because you created your window wrong:


        // Register the window class

WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
"Ch6p2_FirstScene", NULL };
RegisterClassEx( &wc );

// Create the application's window

HWND hWnd = CreateWindowEx(0, "MyCoolWindow", "My First Window",
WS_POPUP | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION | WS_SYSMENU |
WS_THICKFRAME,
50, 50, 200, 100, NULL, NULL, hInst, NULL);

The one-before-last variable in wc is "Ch6p2_FirstScene".
The second parameter in CreateWindowEx() should equal that one.

So:
// Register the window class

WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
"WINDOWCLASSNAME", NULL };
RegisterClassEx( &wc );

// Create the application's window

HWND hWnd = CreateWindowEx(0, "WINDOWCLASSNAME", "My First Window",
WS_POPUP | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION | WS_SYSMENU |
WS_THICKFRAME,
50, 50, 200, 100, NULL, NULL, hInst, NULL);


That should fix it!

... And it did on my computer! No prolem dude!



[edited by - Pipo DeClown on January 31, 2003 2:10:29 PM]
peter86
peter86
I don''t even get an exe with Dev-C++, but it compiles fine with MS VC++ 6.0. So why dosen''t Dev-C++ create an exe for me?
Pipo DeClown
Pipo DeClown
I edited alot =) check my last post, fixed it!

wanted to say that you could use:

WS_OVERLAPPEDWINDOW | WS_VISIBLE

instead of:

WS_POPUP | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
peter86
peter86
Thanks a lot Pipo

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.