Okay. Yes, I see it. DXSETUP.exe
Installed with no problems.
I'll go ahead and try to run my proggie and see what happens.
Printable View
Okay. Yes, I see it. DXSETUP.exe
Installed with no problems.
I'll go ahead and try to run my proggie and see what happens.
And here are my errors,
1>------ Build started: Project: autodidac_dx_2, Configuration: Debug Win32 ------
1> prog.cpp
1>prog.obj : error LNK2019: unresolved external symbol _Direct3DCreate9@4 referenced in function "void __cdecl initD3D(struct HWND__ *)" (?initD3D@@YAXPAUHWND__@@@Z)
1>prog.obj : error LNK2019: unresolved external symbol _D3DXMatrixPerspectiveFovLH@20 referenced in function "void __cdecl render_frame(void)" (?render_frame@@YAXXZ)
1>prog.obj : error LNK2019: unresolved external symbol _D3DXMatrixLookAtLH@16 referenced in function "void __cdecl render_frame(void)" (?render_frame@@YAXXZ)
1>prog.obj : error LNK2019: unresolved external symbol _D3DXMatrixRotationY@8 referenced in function "void __cdecl render_frame(void)" (?render_frame@@YAXXZ)
1>C:\Documents and Settings\Rian Saville\My Documents\Visual Studio 2010\Projects\autodidac_dx_2\Debug\autodidac_dx_2. exe : fatal error LNK1120: 4 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Could this be because I didn't install the symbol files?
No that is b/c you aren't linking with the export libraries.
You will need to add these lines for your linker.
d3d9.lib
d3dx9.lib (release) or d3dx9d.lib (debug)
dxguid.lib (this has all the GUIDs for the interfaces)
For MSVC you add those lines in Linker->Input->Additional Dependencies
Direct3DCreate9() is in d3d9.lib
All the other unresolved externals you are getting are in d3dx9.lib and d3dx9d.lib
If you are linking with the debug version of D3DX (d3dx9d.lib) you should also define D3D_DEBUG_INFO in your pre-processor settings. Additionally you will want to run dxcpl.exe (Program Files->Microsoft DirectX SDK (month year)->DirectX Utilities->DirectX Control Panel) and set the Debug output level to about halfway for Direct3D, DirectInput, and DirectSound (if you use the last two). This will give you some valuable debugging information when developing your Direct3D application. Also you will want to set each of them to use the Debug version of their DLLs. Note that before running any retail game you will want to set these back to retail versions or your game will run like garbage. For other debugging you may want to use maximum validation, break on memory leaks, etc. Break on memory leaks is valid b/c if you set this the DirectX runtimes will break on a COM resource leak. Also when Direct3D exits and if your debug output level is high enough you will get resource allocation IDs for each allocation. If you set the control panel to break on memory leaks and type the allocation ID in the Alloc ID text field your application will break on the line of code that is allocating a resource that has the ID. Very helpful for finding memory leaks.
Keep in mind that Direct3D is a hard beast to debug b/c if you leak ANY resource along the way the entire device will leak and dump tons of leaks to std::out even though it may have been caused by one leak.
I did as you suggested. I'm using MSVS 2010 Express and I placed those files in additional dependencies each on it's own line. It returned one error.
1>LINK : fatal error LNK1104: cannot open file 'd3dx9.lib'
BTW, here is my code if it helps. It's from an online DX tutorial: just a simple program to display a rotating triangle.
The pragmas were suggested on another site I found while googling a solution. As you might guess, they didn't help, hence the comment out.Code:// include the basic windows header files and the Direct3D header file
#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>
#include <d3dx9.h>
//#pragma comment (lib, "d3d9.lib") // D3D library
//#pragma comment (lib, "d3dx9.lib") // D3DX library
// define the screen resolution
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600
// include the Direct3D Library files
//#pragma comment (lib, "d3d9.lib")
//#pragma comment (lib, "d3dx9.lib")
// global declarations
LPDIRECT3D9 d3d; // the pointer to our Direct3D interface
LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class
LPDIRECT3DVERTEXBUFFER9 v_buffer = NULL; // the pointer to the vertex buffer
// function prototypes
void initD3D(HWND hWnd); // sets up and initializes Direct3D
void render_frame(void); // renders a single frame
void cleanD3D(void); // closes Direct3D and releases memory
void init_graphics(void); // 3D declarations
struct CUSTOMVERTEX {FLOAT X, Y, Z; DWORD COLOR;};
#define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE)
// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND hWnd;
WNDCLASSEX wc;
ZeroMemory(&wc, sizeof(WNDCLASSEX));
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpszClassName = "WindowClass";
RegisterClassEx(&wc);
hWnd = CreateWindowEx(NULL, "WindowClass", "Our Direct3D Program",
WS_OVERLAPPEDWINDOW, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT,
NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
// set up and initialize Direct3D
initD3D(hWnd);
// enter the main loop:
MSG msg;
while(TRUE)
{
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(msg.message == WM_QUIT)
break;
render_frame();
}
// clean up DirectX and COM
cleanD3D();
return msg.wParam;
}
// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
} break;
}
return DefWindowProc (hWnd, message, wParam, lParam);
}
// this function initializes and prepares Direct3D for use
void initD3D(HWND hWnd)
{
d3d = Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferWidth = SCREEN_WIDTH;
d3dpp.BackBufferHeight = SCREEN_HEIGHT;
// create a device class using this information and the info from the d3dpp stuct
d3d->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&d3ddev);
init_graphics(); // call the function to initialize the triangle
d3ddev->SetRenderState(D3DRS_LIGHTING, FALSE); // turn off the 3D lighting
}
// this is the function used to render a single frame
void render_frame(void)
{
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->BeginScene();
// select which vertex format we are using
d3ddev->SetFVF(CUSTOMFVF);
// SET UP THE PIPELINE
D3DXMATRIX matRotateY; // a matrix to store the rotation information
static float index = 0.0f; index+=0.05f; // an ever-increasing float value
// build a matrix to rotate the model based on the increasing float value
D3DXMatrixRotationY(&matRotateY, index);
// tell Direct3D about our matrix
d3ddev->SetTransform(D3DTS_WORLD, &matRotateY);
D3DXMATRIX matView; // the view transform matrix
D3DXMatrixLookAtLH(&matView,
&D3DXVECTOR3 (0.0f, 0.0f, 10.0f), // the camera position
&D3DXVECTOR3 (0.0f, 0.0f, 0.0f), // the look-at position
&D3DXVECTOR3 (0.0f, 1.0f, 0.0f)); // the up direction
d3ddev->SetTransform(D3DTS_VIEW, &matView); // set the view transform to matView
D3DXMATRIX matProjection; // the projection transform matrix
D3DXMatrixPerspectiveFovLH(&matProjection,
D3DXToRadian(45), // the horizontal field of view
(FLOAT)SCREEN_WIDTH / (FLOAT)SCREEN_HEIGHT, // aspect ratio
1.0f, // the near view-plane
100.0f); // the far view-plane
d3ddev->SetTransform(D3DTS_PROJECTION, &matProjection); // set the projection
// select the vertex buffer to display
d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));
// copy the vertex buffer to the back buffer
d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
d3ddev->EndScene();
d3ddev->Present(NULL, NULL, NULL, NULL);
}
// this is the function that cleans up Direct3D and COM
void cleanD3D(void)
{
v_buffer->Release(); // close and release the vertex buffer
d3ddev->Release(); // close and release the 3D device
d3d->Release(); // close and release Direct3D
}
// this is the function that puts the 3D models into video RAM
void init_graphics(void)
{
// create the vertices using the CUSTOMVERTEX struct
CUSTOMVERTEX vertices[] =
{
{ 3.0f, -3.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 255), },
{ 0.0f, 3.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 0), },
{ -3.0f, -3.0f, 0.0f, D3DCOLOR_XRGB(255, 0, 0), },
};
// create a vertex buffer interface called v_buffer
d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
0,
CUSTOMFVF,
D3DPOOL_MANAGED,
&v_buffer,
NULL);
VOID* pVoid; // a void pointer
// lock v_buffer and load the vertices into it
v_buffer->Lock(0, 0, (void**)&pVoid, 0);
memcpy(pVoid, vertices, sizeof(vertices));
v_buffer->Unlock();
}
neither d3dx9.lib nor d3dx9d.lib can be found
I changed the order of those files you mentioned. Now it only tells me it can't find dxguid.lib. It stops at whatever the first file is.
It did find d3d9.lib
I did a search for both files. The difference is that this file is in
C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib
while d3dx9.lib is not. Apparently this is the directory it wants the includes to be in. I'm going to copy that file here and see what happens.
Don't copy the file... Then you just end up with junk everywhere. Just add the file with complete path, or add the folder to the solution so it knows to look there.
SUCCESS
I moved both files into that directory and it worked without errors. Now hopefully I won't have to pester you guys for a while.
Sry, syz, I did it before I saw your post. Should I take them out?
Add the complete path to linker->additional dependencies?
Where in the solution would I add the folder?
I would remove any files you copied because they should not be in those folders. That is not the proper method.
Try adding the paths to where those files are originally located in Linker->General->Additional Library Dependencies
I don't see "additional library dependencies"
I do see "additional library directories" is this what you meant?
I put a directory where both files can be found:
C:\Program Files\Microsoft DirectX SDK (June 2010)\Lib\x86
here are my errors
1>------ Build started: Project: autodidac_dx_2, Configuration: Debug Win32 ------
1> LINK : C:\Documents and Settings\Rian Saville\My Documents\Visual Studio 2010\Projects\autodidac_dx_2\Debug\autodidac_dx_2. exe not found or not built by the last incremental link; performing full link
1>prog.obj : error LNK2019: unresolved external symbol _Direct3DCreate9@4 referenced in function "void __cdecl initD3D(struct HWND__ *)" (?initD3D@@YAXPAUHWND__@@@Z)
1>prog.obj : error LNK2019: unresolved external symbol _D3DXMatrixPerspectiveFovLH@20 referenced in function "void __cdecl render_frame(void)" (?render_frame@@YAXXZ)
1>prog.obj : error LNK2019: unresolved external symbol _D3DXMatrixLookAtLH@16 referenced in function "void __cdecl render_frame(void)" (?render_frame@@YAXXZ)
1>prog.obj : error LNK2019: unresolved external symbol _D3DXMatrixRotationY@8 referenced in function "void __cdecl render_frame(void)" (?render_frame@@YAXXZ)
1>C:\Documents and Settings\Rian Saville\My Documents\Visual Studio 2010\Projects\autodidac_dx_2\Debug\autodidac_dx_2. exe : fatal error LNK1120: 4 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Are you sure I can't just copy them into the standard directory?
Yes, I meant "Additional Library Directories." I was reading your comment while typing and messed up.
You can do it however you want, but that is not the right way to do things.
Do you still have the files listed inside Linker->Input->Additional Dependencies? You need them there also.
No, I took them out thinking they'd be redundant but I'll go ahead and add them and see what happens.