help linking direct 3d library

Started by
10 comments, last by bpops 18 years, 6 months ago
I know some C, C++, Java, and IDL, but I am completely new to Direct3D and graphics in general. I picked up this book, Beginning Game Programming by Jonathan Harbour, which teaches game programming via C++ and Direct3D. I'm on the 5th Chapter, which gets you to use Direct3D for the first time. I am getting a fatal error when I compile.
Quote:Compiling... winmain.cpp c:\program files\microsoft visual studio\myprojects\d3d_windowed\winmain.cpp(6) : fatal error C1083: Cannot open include file: 'd3d9.h': No such file or directory Error executing cl.exe.
I have at the top of my program,
Quote: //header files to include #include <d3d9.h> #include <time.h>
And I have added d3d9.lib in the Project Settings (I'm using Microsoft Visual C++). I have the Direct3D SDK installed as well, so I'm unsur as to why this isn't working. Could it be problems with me using a different version of Direct3D? Or maybe I haven't installed it correctly? I'm just a newb, and any help is greatly appreciated. Thanks in advance!
Advertisement
i don't know what it is like with VC++, but there should be a thing somewhere that allows you to enter a directory where the compiler will search for your headers. add the folder that d3d9.h is in. this might not be THE problem but it might be A problem.

hope it helps
i will give that a try and let you know.

thanks
ah, ok, so the Microsoft DirectX SDK has a folder called "Include." I copied all the files from there to the "Include" folder in the MS Visual C++ directory, and all worked (except the compile errors, but that's a different story!)

So thanks for the help!
:( I hate to be a pest, but after all the errors were cleaned up it compiled just fine. When I ran it, however, there were linking problems:

Quote:--------------------Configuration: winmain - Win32 Debug--------------------
Linking...
winmain.obj : error LNK2001: unresolved external symbol _Direct3DCreate9@4
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/winmain.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

winmain.exe - 3 error(s), 0 warning(s)


any ideas?
You might need to have:

#include "d3dx9.h"

And you might need to link "d3dx9.lib" in Project Setting as well.

I hope that helps.

P.S You're not being a pest, because you're giving me something to do well my lunch cooks ;)
hmm.. well I added d3dx9.lib to the project settings, and moved EVERY .lib file from the Microsoft DirectX library folder to the Visual C++ folder, and now I'm getting a slightly different error:

Quote:--------------------Configuration: winmain - Win32 Debug--------------------
Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/winmain.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

winmain.exe - 2 error(s), 0 warning(s)


thanks again, Harryu
Well, at least now you only have 1 error...

Have you included windows.h:

#include <windows.h>

Try that, and if it doesn't work then I will look for something else that might be the problem.
i still get the problem. If it helps, here's my entire code:

Quote:
//Beginning Game Programming
//Chapter 5
//d3d_windowed program

//header files to include
#include <windows.h>
#include <d3d9.h>
#include <time.h>

//application title
#define APPTITLE "Direct3D_Windowed"

//forward declarations
LRESULT WINAPI WinProc(HWND,UINT,WPARAM,LPARAM);
ATOM MyRegisterClass(HINSTANCE);
int Game_Init(HWND);
void Game_Run(HWND);
void Game_End(HWND);

//Direct3D objects
LPDIRECT3D9 d3d = NULL;
LPDIRECT3DDEVICE9 d3ddev = NULL;

//window event callback function
LRESULT WINAPI WinProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
Game_End(hWnd);
PostQuitMessage(0);
return 0;
}

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


//helper function to set up the window properties
ATOM MyRegisterClass(HINSTANCE hInstance)
{
//create the window class structure
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);

//fill the struct with info
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = APPTITLE;
wc.hIconSm = NULL;

//set up the window with the class info
return RegisterClassEx(&wc);
}

//entry point for a windows program
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//declare variables
MSG msg;

//register the class
MyRegisterClass(hInstance);

//init the app
//note--got rid of initinstance
HWND hWnd;

//create a new window
hWnd = CreateWindow(
APPTITLE,
APPTITLE,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
500,
400,
NULL,
NULL,
hInstance,
NULL);

//was there an error creating the window?
if (!hWnd)
return FALSE;

//display the window
ShowWindow (hWnd, nCmdShow);
UpdateWindow(hWnd);

//init the game
if (!Game_Init(hWnd))
return 0;

//main message loop
int done = 0;
while (!done)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
//look for quit message
if(msg.message == WM_QUIT)
{
MessageBox(hWnd, "Received WM_QUIT message","WinMain", MB_OK);
done = 1;
}

//decode and pass messages on to WndProc
TranslateMessage(&msg);
DispatchMessage(&msg);
}

else
//process game loop (else prevents running after window is closed)
Game_Run(hWnd);
}

return msg.wParam;
}


int Game_Init(HWND hwnd)
{
//display init message
MessageBox(hwnd, "Program is about to start","Game_Init",MB_OK);

//init Direct3D
d3d = Direct3DCreate9(D3D_SDK_VERSION);
if(d3d == NULL)
{
MessageBox(hwnd, "Error initializing Direct3D", "Error", MB_OK);
return 0;
}

//set Direct3D presentation parameters
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

//create Direct3D device
d3d->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hwnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&d3ddev);

if (d3ddev == NULL)
{
MessageBox(hwnd, "Error creating Direct3D device","Error",MB_OK);
return 0;
}

//set random number seed
srand(time(NULL));

//return okay
return 1;
}


void Game_Run(HWND hwnd)
{
//make sure the Direct3D device is valid
if(d3ddev == NULL)
return;

//clear the backbuffer with a green color
d3ddev->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,255,255),1.0f,0);

//start rendering
if(d3ddev->BeginScene())
{
//do something here!

//stop rendering
d3ddev->EndScene();
}

//display the backbuffer on the screen
d3ddev->Present(NULL, NULL, NULL, NULL);

}


void Game_End(HWND hwnd)
{

//display close message
MessageBox(hwnd, "Program is about to end","Game_End",MB_OK);

//release the Direct3D device
if(d3ddev != NULL)
d3ddev->Release();

//release the Direct3D object
if(d3d != NULL)
d3d->Release();
}
sorry, i suppose it's a bit difficult to read since the tabs didn't all translate over

This topic is closed to new replies.

Advertisement