[solved][C++]DirectX SDK-błąd linkera:unresolved external

0

Mam problem z bibliotekami DirectX'a. Ściągnąłem sobie najnowszą wersję (czerwiec 2008) zestawu startowego DirectX dla programistów C++ i C#( DirectX SDK). Otóż gdy wg. załączonego tutoriala chcę odpalić samo środowisko 3D, to linker mi protestuje. Załączam wyfiltrowany kod(po co tutaj api, jeśli działa :-P ):

// Szablon aplikacji okienkowej Win32 z użyciem DirectX 3D v9.0.
// Kod źródłowy utworzony na : 
// Visual C++ 2008 Express Edition, v9.0.21022.8 RTM
// Wymagany jest DirectX SDK 2008 do działania kodu źródłowego

// #include ...
#include <d3d9.h>

// Zmienne globalne ---------------------------------------------
//...

LPDIRECT3D9 g_pD3D = NULL ;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL ;
// Deklaracje zapowiedziane -------------------------------------
//...
void Render( void ) ;
void ReleaseD3D( void ) ;
// --------------------------------------------------------------

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine, int nCmdShow )
{
        ...
	// Inicjalizacja trybu 3D w głównym oknie aplikacji --------
	if( NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) ) //tego tyczy się błąd linkera
// a jestem pewien, że wersje się zgadzają!!!
	{
		MessageBox( NULL, _T("Nie wykryto bibliotek DirectX w wersji 9.0 lub nowszej!")
						  _T("\nPonowne zainstalowanie DirectX powinno rozwiązać problem."),
				    szTitle, MB_OK | MB_ICONERROR ) ;
		return E_FAIL ;
	}
	D3DPRESENT_PARAMETERS d3dpp ; 

	ZeroMemory( &d3dpp, sizeof(d3dpp) ) ;
	d3dpp.Windowed = TRUE ;
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD ;
	d3dpp.BackBufferFormat = D3DFMT_UNKNOWN ;
	if( FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
               D3DCREATE_SOFTWARE_VERTEXPROCESSING,
               &d3dpp, &g_pd3dDevice)) )
	{
		MessageBox( NULL, _T("Utworzenie środowiska DirectX 3D nie powiodło się!"),
				    szTitle, MB_OK | MB_ICONERROR ) ;
		return E_FAIL ;	
	}

        ...
}
// -------------------------------------------------------------

LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    PAINTSTRUCT ps ;
    HDC hdc;

    switch ( message )
    {
	case WM_PAINT:
        hdc = BeginPaint( hWnd, &ps ) ;
		Render( ) ; // DirectX - funkcja renderująca
        EndPaint( hWnd, &ps ) ;
        break ;
    case WM_DESTROY:
		ReleaseD3D( ) ; // DirectX - funkcja zwalniająca obiekty
        PostQuitMessage( 0 ) ;
        break ;
    default :
        return DefWindowProc( hWnd, message, wParam, lParam ) ;
        break ;
    }

    return 0;
}
// -------------------------------------------------------------

void Render( void )
{
	// Czyszczenie buforu pozaekranowego
	g_pd3dDevice -> Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 ) ;
	// Rysowanie sceny
	g_pd3dDevice -> BeginScene( ) ;

	// Rendering umieść tutaj

	g_pd3dDevice -> EndScene( ) ;
}
// -------------------------------------------------------------
void ReleaseD3D( void )
{
	if( g_pd3dDevice != NULL ) g_pd3dDevice->Release( ) ;
    if( g_pD3D != NULL ) g_pD3D->Release( ) ;
}
// -------------------------------------------------------------

Dokładny opis błędu: linker error LNK2019: unresolved external variable in function Direct3DCreate9...
Gdy klikam dwukrotnie na zapis, to nie ukazuje mi się plik z błędem :|

Dodatkowa informacja: projekty DirectX SDK zostały utworzone dla visual C++ 2005. Być może vc2008 ma jeszcze jakieś bugi albo DirectX SDK. Szukałem tego wszędzie, ale nic konkretnego.

0

a biblioteki lib dodane do projektu?

0

Poszukaj:
user image

0

Nie jestem pewien, czy plik nagłówkowy <d3d9.h> załącza lib'y.
Sprawdzę i jeżeli nic nie zobaczę to chyba się zbiczuję.
Dzięki, ale o tym nie pomyślałem. Mózg mi się chyba przyblokował [glowa].Jak rozwiążę problem, to dam znać.
pozdrowionko ;)

0
komputer098 napisał(a)

Nie jestem pewien, czy plik nagłówkowy <d3d9.h> załącza lib'y.

oczywiście, że NIE dołącza, samemu trzeba sobie dołączyć, dla d3dx9 jest chyba odzielny lib, ale nie jestem pewien, hoho się już nie bawiłem dx3d

0

...Normalnie iść i się powiesić [wstyd]

Problem rozwiązany, załączam kompletny kod aplikacji. W zasobach programu trzeba dodać bibliotekę "d3d9.lib". Acha, formatowanie kodu jest tutaj inne(w edytorze kodu znaki mają jednakową szerokość).

// Szablon aplikacji okienkowej Win32 z użyciem DirectX 3D v9.0.
// Kod źródłowy utworzony na : 
// Visual C++ 2008 Express Edition, v9.0.21022.8 RTM
// Wymagany jest DirectX SDK 2008 do działania kodu źródłowego

#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
#include <d3d9.h>

// Zmienne globalne ---------------------------------------------
static TCHAR szWindowClass[] = _T("NazwaGlownejKlasy") ;
static TCHAR szTitle[] = _T("Napis na belce tytułowej") ;

HINSTANCE hInst ;

LPDIRECT3D9 g_pD3D = NULL ;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL ;
// Deklaracje zapowiedziane -------------------------------------
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ) ;
void Render( void ) ;
void ReleaseD3D( void ) ;
// --------------------------------------------------------------

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine, int nCmdShow )
{
    // Utworzenie głównej klasy, jej inicjalizacja i rejestracja
	WNDCLASSEX wcex ;

    wcex.cbSize        = sizeof( WNDCLASSEX ) ;
    wcex.style         = CS_HREDRAW | CS_VREDRAW ;
    wcex.lpfnWndProc   = WndProc ;
    wcex.cbClsExtra    = 0 ;
    wcex.cbWndExtra    = 0 ;
    wcex.hInstance     = hInstance ;
    wcex.hIcon         = LoadIcon( hInstance, MAKEINTRESOURCE(IDI_APPLICATION) ) ;
    wcex.hCursor       = LoadCursor( NULL, IDC_ARROW ) ;
    wcex.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 ) ;
    wcex.lpszMenuName  = NULL ;
    wcex.lpszClassName = szWindowClass ;
    wcex.hIconSm       = LoadIcon( wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION) ) ;

    if ( !RegisterClassEx(&wcex) )
    {
        MessageBox( NULL, _T("Rejestracja głównej klasy aplikacji nie powiodła się!")
					      _T("\nPrzyczyna : Call to RegisterClassEx failed!"),
					_T("System"), MB_OK | MB_ICONERROR ) ;
        return 1 ;
    }

	// Utworzenie, pokazanie głównego okna aplikacji -----------
    hInst = hInstance ;

    HWND hWnd = CreateWindow( szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
		                      CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL,
                              NULL, hInstance, NULL ) ;
    if ( !hWnd )
    {
        MessageBox( NULL, _T("Utworzenie głównego okna aplikacji nie powiodło się!")
			              _T("\nPrzyczyna : Call to CreateWindow failed!"),
                    _T("System"), MB_OK | MB_ICONERROR ) ;
        return 1 ;
    }

	// Inicjalizacja trybu 3D w głównym oknie aplikacji --------
	if( NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) )
	{
		MessageBox( NULL, _T("Nie wykryto bibliotek DirectX w wersji 9.0 lub nowszej!")
						  _T("\nPonowne zainstalowanie DirectX powinno rozwiązać problem."),
				    szTitle, MB_OK | MB_ICONERROR ) ;
		return E_FAIL ;
	}
	D3DPRESENT_PARAMETERS d3dpp ; 

	ZeroMemory( &d3dpp, sizeof(d3dpp) ) ;
	d3dpp.Windowed = TRUE ;
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD ;
	d3dpp.BackBufferFormat = D3DFMT_UNKNOWN ;
	if( FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
               D3DCREATE_SOFTWARE_VERTEXPROCESSING,
               &d3dpp, &g_pd3dDevice)) )
	{
		MessageBox( NULL, _T("Utworzenie środowiska DirectX 3D nie powiodło się!"),
				    szTitle, MB_OK | MB_ICONERROR ) ;
		return E_FAIL ;	
	}

    ShowWindow( hWnd, nCmdShow ) ;
    UpdateWindow( hWnd ) ;

    // Główna pętla komunikatów : ------------------------------
    MSG msg ;
    while ( GetMessage(&msg, NULL, 0, 0) )
    {
        TranslateMessage( &msg ) ;
        DispatchMessage( &msg ) ;
    }

    return (int)msg.wParam ;
}
// -------------------------------------------------------------

LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    PAINTSTRUCT ps ;
    HDC hdc ;

    switch ( message )
    {
	case WM_PAINT:
        hdc = BeginPaint( hWnd, &ps ) ;
		Render( ) ; // DirectX - funkcja renderująca
        EndPaint( hWnd, &ps ) ;
        break ;
    case WM_DESTROY:
		ReleaseD3D( ) ; // DirectX - funkcja zwalniająca obiekty
        PostQuitMessage( 0 ) ;
        break ;
    default :
        return DefWindowProc( hWnd, message, wParam, lParam ) ;
        break ;
    }

    return 0;
}
// -------------------------------------------------------------

void Render( void )
{
	// Czyszczenie buforu pozaekranowego
	g_pd3dDevice -> Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0 ) ;
	// Rysowanie sceny
	g_pd3dDevice -> BeginScene( ) ;

	// Rendering umieść tutaj

	g_pd3dDevice -> EndScene( ) ;
	// Wymiana buforów
	g_pd3dDevice -> Present( NULL, NULL, NULL, NULL ) ;
}
// -------------------------------------------------------------
void ReleaseD3D( void )
{
	if( g_pd3dDevice != NULL ) g_pd3dDevice -> Release( ) ;
    if( g_pD3D != NULL ) g_pD3D -> Release( ) ;
}
// -------------------------------------------------------------
0
crayze napisał(a)
komputer098 napisał(a)

Nie jestem pewien, czy plik nagłówkowy <d3d9.h> załącza lib'y.

oczywiście, że NIE dołącza, samemu trzeba sobie dołączyć, dla d3dx9 jest chyba odzielny lib, ale nie jestem pewien, hoho się już nie bawiłem dx3d

tak sie sklada, ze 'nowe', 'porzadne' naglowkowe pliki biblioteczne SAME DOŁĄCZAJĄ potrzebne liby :) patrz np. Boost. do tego wlasnie sluzy

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

ktory zreszta jest przez visuala bardzo ladnie obslugiwany. szkoda ze microsoftowe dx'y nie korzystaja z microsoftowych dodatkow do kompilatora..

0

no to wygląda na to, że nagłówki dx3d nie są 'nowe' i 'porządne', bo trzeba ręcznie dołączać, liby przynajmniej w tych SDK 2005-2006 które miałem...

1 użytkowników online, w tym zalogowanych: 0, gości: 1