October 03, 2004
I'm getting started with DirectX and at this point am just trying to get code to compile. I'm getting 'Symbol Undefined: _Direct3dCreate9@4' which I understand means that I need to link in a library. So, my question is: Which one do I need to link in? I've already downloaded the DirectX SDK and gotten a bunch of .lib files from that, but I can't seem to find one that works for this.

Thanks in advance.

Here is my compile line: dmc CreateDevice -I\dm\stlport\stlport \dm\lib\d3d9.lib

Here is my code (from the DirectX SDK tutorials):
//-----------------------------------------------------------------------------
// File: CreateDevice.cpp
//
// Desc: This is the first tutorial for using Direct3D. In this tutorial, all
//       we are doing is creating a Direct3D device and using it to clear the
//       window.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#include <d3d9.h>




//----------------------------------------------------------------------------- // Global variables //----------------------------------------------------------------------------- LPDIRECT3D9             g_pD3D       = NULL; // Used to create the D3DDevice LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Our rendering device




//-----------------------------------------------------------------------------
// Name: InitD3D()
// Desc: Initializes Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
// Create the D3D object, which is needed to create the D3DDevice.
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;

// Set up the structure used to create the D3DDevice. Most parameters are
// zeroed out. We set Windowed to TRUE, since we want to do D3D in a
// window, and then set the SwapEffect to "discard", which is the most
// efficient method of presenting the back buffer to the display.  And
// we request a back buffer format that matches the current desktop display
// format.
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

// Create the Direct3D device. Here we are using the default adapter (most
// systems only have one, unless they have multiple graphics hardware cards
// installed) and requesting the HAL (which is saying we want the hardware
// device rather than a software one). Software vertex processing is
// specified since we know it will work on all cards. On cards that support
// hardware vertex processing, though, we would see a big performance gain
// by specifying hardware vertex processing.
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
{
return E_FAIL;
}

// Device state would normally be set here

return S_OK;
}




//-----------------------------------------------------------------------------
// Name: Cleanup()
// Desc: Releases all previously initialized objects
//-----------------------------------------------------------------------------
VOID Cleanup()
{
if( g_pd3dDevice != NULL)
g_pd3dDevice->Release();

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




//-----------------------------------------------------------------------------
// Name: Render()
// Desc: Draws the scene
//-----------------------------------------------------------------------------
VOID Render()
{
if( NULL == g_pd3dDevice )
return;

// Clear the backbuffer to a blue color
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0
);

// Begin the scene
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
// Rendering of scene objects can happen here

// 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:
Cleanup();
PostQuitMessage( 0 );
return 0;

case WM_PAINT:
Render();
ValidateRect( hWnd, NULL );
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,
"D3D Tutorial", NULL };
RegisterClassEx( &wc );

// Create the application's window
HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 01: CreateDevice",
WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
GetDesktopWindow(), NULL, wc.hInstance, NULL );

// Initialize Direct3D
if( SUCCEEDED( InitD3D( hWnd ) ) )
{
// Show the window
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );

// Enter the message loop
MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}

UnregisterClass( "D3D Tutorial", wc.hInstance );
return 0;
}


October 03, 2004
In article <cjpe2m$187q$1@digitaldaemon.com>, Bob Larson says...
>
>I'm getting started with DirectX and at this point am just trying to get code to compile. I'm getting 'Symbol Undefined: _Direct3dCreate9@4' which I understand means that I need to link in a library. So, my question is: Which one do I need to link in? I've already downloaded the DirectX SDK and gotten a bunch of .lib files from that, but I can't seem to find one that works for this.
>
>Thanks in advance.
>
>Here is my compile line: dmc CreateDevice -I\dm\stlport\stlport \dm\lib\d3d9.lib
>
>Here is my code (from the DirectX SDK tutorials):
>//-----------------------------------------------------------------------------
>// File: CreateDevice.cpp
>//
>// Desc: This is the first tutorial for using Direct3D. In this tutorial, all
>//       we are doing is creating a Direct3D device and using it to clear the
>//       window.
>//
>// Copyright (c) Microsoft Corporation. All rights reserved.
>//-----------------------------------------------------------------------------
>#include <d3d9.h>
>
>
>
>
>//----------------------------------------------------------------------------- // Global variables //----------------------------------------------------------------------------- LPDIRECT3D9             g_pD3D       = NULL; // Used to create the D3DDevice LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Our rendering device
>
>
>
>
>//-----------------------------------------------------------------------------
>// Name: InitD3D()
>// Desc: Initializes Direct3D
>//-----------------------------------------------------------------------------
>HRESULT InitD3D( HWND hWnd )
>{
>// Create the D3D object, which is needed to create the D3DDevice.
>if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
>return E_FAIL;
>
>// Set up the structure used to create the D3DDevice. Most parameters are
>// zeroed out. We set Windowed to TRUE, since we want to do D3D in a
>// window, and then set the SwapEffect to "discard", which is the most
>// efficient method of presenting the back buffer to the display.  And
>// we request a back buffer format that matches the current desktop display
>// format.
>D3DPRESENT_PARAMETERS d3dpp;
>ZeroMemory( &d3dpp, sizeof(d3dpp) );
>d3dpp.Windowed = TRUE;
>d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
>d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
>
>// Create the Direct3D device. Here we are using the default adapter (most
>// systems only have one, unless they have multiple graphics hardware cards
>// installed) and requesting the HAL (which is saying we want the hardware
>// device rather than a software one). Software vertex processing is
>// specified since we know it will work on all cards. On cards that support
>// hardware vertex processing, though, we would see a big performance gain
>// by specifying hardware vertex processing.
>if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
>D3DCREATE_SOFTWARE_VERTEXPROCESSING,
>&d3dpp, &g_pd3dDevice ) ) )
>{
>return E_FAIL;
>}
>
>// Device state would normally be set here
>
>return S_OK;
>}
>
>
>
>
>//-----------------------------------------------------------------------------
>// Name: Cleanup()
>// Desc: Releases all previously initialized objects
>//-----------------------------------------------------------------------------
>VOID Cleanup()
>{
>if( g_pd3dDevice != NULL)
>g_pd3dDevice->Release();
>
>if( g_pD3D != NULL)
>g_pD3D->Release();
>}
>
>
>
>
>//-----------------------------------------------------------------------------
>// Name: Render()
>// Desc: Draws the scene
>//-----------------------------------------------------------------------------
>VOID Render()
>{
>if( NULL == g_pd3dDevice )
>return;
>
>// Clear the backbuffer to a blue color
>g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0
>);
>
>// Begin the scene
>if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
>{
>// Rendering of scene objects can happen here
>
>// 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:
>Cleanup();
>PostQuitMessage( 0 );
>return 0;
>
>case WM_PAINT:
>Render();
>ValidateRect( hWnd, NULL );
>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,
>"D3D Tutorial", NULL };
>RegisterClassEx( &wc );
>
>// Create the application's window
>HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 01: CreateDevice",
>WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
>GetDesktopWindow(), NULL, wc.hInstance, NULL );
>
>// Initialize Direct3D
>if( SUCCEEDED( InitD3D( hWnd ) ) )
>{
>// Show the window
>ShowWindow( hWnd, SW_SHOWDEFAULT );
>UpdateWindow( hWnd );
>
>// Enter the message loop
>MSG msg;
>while( GetMessage( &msg, NULL, 0, 0 ) )
>{
>TranslateMessage( &msg );
>DispatchMessage( &msg );
>}
>}
>
>UnregisterClass( "D3D Tutorial", wc.hInstance );
>return 0;
>}
>
>

You need to import d3d9.dll (usually located in c:\windows\system32) with
implib.exe. To use implib you need to download the Basic Utilities zip in the
download section of Digital Mars. On the other hand, the d3dx9.lib (which includes the D3DX API) is supplied only as static library so implib doens't helps here.