Funktion nicht Definiert

lfp

Grünschnabel
Hallo an Alle!
D3D10CreateDeviceAndSwapChain <-Diese Funktion macht Probleme

(!)Ja, ich weiß auch, dass das eine Directx-Funktion ist und wir hier im c/c++ Forum sind,
aber es geht garnicht um Directx, sondern allgemein um Visual Studio...

Beim Compilieren meines Codes bekomme ich folgende Fehlermeldung(en):

Code:
main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_D3D10CreateDeviceAndSwapChain@32" in Funktion ""bool __cdecl InitDirectX(void)" (?InitDirectX@@YA_NXZ)".

Ich hab die Directx Libs und die .h's includiert...
MSDN meint:

-Header "D3D10Misc.h" (den ich auch includiert hab)
-Library "D3D10.dll " (mit der ich nichts anzufangen weiß, weil sie ja eigentlich von einer anderen Lib geladen werden sollte, die ich wiederum mit "#pragma comment(lib,"NAME")" eingebunden habe...)


Ich weiß nichmehr weiter, und deshalb frage ich euch: Was mach ich falsch?:confused:



Hier ist der gesamte Code, den aber wahrscheinlich keiner braucht, da es ja Directx ist:
Code:
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code)&0x8000)?1:0)

#include <windows.h>
#include <D3D10.h>
#include <D3DX10.h>
#include <D3D10Misc.h>

#pragma comment (lib, "d3dx10.lib")
#pragma comment (lib, "d3d10.lib")




bool Game_Init(HINSTANCE hInstance);
void Game_Main(void);
void Game_Shutdown(void);
bool InitDirectX();
bool RunWindow();
void ReleaseDirectX(void);
HWND hWnd;

ID3D10Device*           gDevice = NULL;        //Unser DirectX-Device-Interface
ID3D10RenderTargetView* gRTV = NULL;           //Unser RenderTargetView-Interface
IDXGISwapChain*         gSwapChain = NULL;     //Unser SwapChain-Interface

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    if(msg == WM_QUIT) {PostQuitMessage(0); return 0;}
    if(msg == WM_CLOSE) {PostQuitMessage(0); return 0;}
    if(msg == WM_KEYDOWN && wParam == VK_ESCAPE) {PostQuitMessage(0); return 0;}
    return DefWindowProc(hWnd, msg, wParam, lParam);
}
bool RunWindow()
{
    MSG msg = {0};
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        if(msg.message == WM_QUIT)
            return false;
        DispatchMessage(&msg);
        TranslateMessage(&msg);
    }
    return true;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    Game_Init(hInstance);
    while(RunWindow())
    {
        Game_Main();
    }
    Game_Shutdown();
    return 0;
}

bool InitWindow(HINSTANCE hInstance)
{
    WNDCLASS wc = {0};                                            //Die WiNDowCLASS-Struktur initalisieren
    wc.hbrBackground = HBRUSH(GetStockObject(BLACK_BRUSH));       //Wie sieht der Hintergrund aus?
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);                     //Was für ein Cursor?
    wc.hIcon = LoadIcon(NULL, IDC_ARROW);                         //Was für ein Icon?
    wc.hInstance = hInstance;                                     //Handle auf die Instanz des Programms
    wc.lpfnWndProc = WndProc;                                     //Callback-Funktion der Eingaben
    wc.lpszClassName = "This is it!";                            //Klassenname (wth?)
    wc.style = CS_HREDRAW|CS_VREDRAW;                             //so zeugs.. noch nachschaun wofür (wth?)

    RegisterClass(&wc);                                           //Registrieren der Fensterklasse

    if(NULL==(hWnd = CreateWindowEx(NULL,                         //Schlussendlich das Fenster erstellen
                                    wc.lpszClassName,             //Klassenname
                                    "That's it!",                //Fenstername
                                    WS_VISIBLE|WS_POPUP,          //Verschiedene Flags (wth?)
                                    0,0,                          //Position d. Fensters
                                    GetSystemMetrics(0),          //Auflösung Breite
                                    GetSystemMetrics(1),          //Auflösung Höhe
                                    NULL,                         //(wth?)
                                    NULL,                         //(wth?)
                                    hInstance,                    //Handle auf die Instanz des Programms
                                    NULL)))                       //(wth?)
        return false;
    return true;
}
bool Game_Init(HINSTANCE hInstance){
    if(!InitWindow(hInstance))    //Windows-Fenster initalisieren
        return false;
    if(!InitDirectX())            //DirectX-Zeugs initalisieren
        return false;
    return true;
}

bool InitDirectX()
{

    DXGI_SWAP_CHAIN_DESC dsc = {0};                         //Die DirectXGraphicInterface_SWAP_CHAIN_DESCription-Struktur initalisieren
    dsc.BufferCount = 1;                                    //Wieviele Buffer?
    dsc.BufferDesc.Width = 1920;                            //Breite des Buffers
    dsc.BufferDesc.Height = 1080;                           //Höhe des Buffers
    dsc.BufferDesc.RefreshRate.Denominator = 1;             //Nenner der Refreshrate (ist ein Bruch, sechzig eintel)
    dsc.BufferDesc.RefreshRate.Numerator = 60;              //Zähler der Refreshrate
    dsc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;     //Farbformat des Buffers, 8Bit each
    dsc.Windowed = false;                                   //Fenstermodus?
    dsc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;      //Zweck des Buffers?
    dsc.OutputWindow = hWnd;                                //Handle des erzeugten Fensters
    dsc.SampleDesc.Count = 1;                               //Kein MultiSampling benutzen
    dsc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;              //SwapChain soll so effizient wie möglich sein
    //Schließlich Device und SwapChain erstellen

	if(FAILED(D3D10CreateDeviceAndSwapChain(NULL,                       //Welche Grafikkarte
	                                        D3D10_DRIVER_TYPE_HARDWARE, //Hardware-Driver
	                                        NULL,                       //Wenn Software-Driver, hier Referenz auf Driver-DLL
	                                        0,                          //Flags
	                                        D3D10_SDK_VERSION,          //SDK-Version
	                                        &dsc,                       //Die SwapChainDesc
	                                        &gSwapChain,                //Das zukünftige SwapChain-Interface
	                                        &gDevice)))                 //Das zukünftige Device-Interface
	    return false;

	ID3D10Texture2D* BackBuffer = NULL;                         //Wir erstellen einen Backbuffer

    if(FAILED(gSwapChain->GetBuffer(0,                          //Bufferindex
                                    __uuidof(ID3D10Texture2D),  //Typ des bufferverändernden Interfaces
                                    (void**)&BackBuffer)))      //Zeiger auf den Backbuffer
        return false;

    if(FAILED(gDevice->CreateRenderTargetView(                  //RTV erstellen aus
                                                BackBuffer,     //Backbuffer
                                                NULL,           //RTVDesc
                                                &gRTV)))        //Dem zukünftigen RTV-Interface
        return false;

    BackBuffer->Release();                                      //Backbuffer ist im RTV enthalten, also als Element jetzt überflüssig
    gDevice->OMSetRenderTargets(1, &gRTV, NULL);                //Device mit RTV verbinden
	D3D10_VIEWPORT vp = {0};                                    //D3D10_VIEWPORT-Struktur initalisieren
    vp.TopLeftX = 0;                                            //Position des Viewports
    vp.TopLeftY = 0;                                            //Position des Viewports
    vp.Width = 1920;                                            //Breite des Viewports
    vp.Height = 1080;                                           //Höhe des Viewports
    vp.MinDepth = 0.0f;                                         //Tiefe des Viewports
    vp.MaxDepth = 1.0f;                                         //Tiefe des Viewports

    gDevice->RSSetViewports(1, &vp);                            //Device mit Viewport verbinden

    return true;                                                //all right!

}
void Game_Shutdown()
{
    ReleaseDirectX();   //DirectX aufräumen
}
void ReleaseDirectX()
{
    if(gRTV) gRTV->Release();                       //RTV lösen
    gSwapChain->SetFullscreenState(false, NULL);    //SwapChain auf Fenstermodus schalten (wichtig)
    if(gSwapChain) gSwapChain->Release();           //SwapChain lösen
    if(gDevice) gDevice->Release();                 //Device lösen
}
void Game_Main()
{
    gDevice->ClearRenderTargetView(gRTV, D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f));    //RTV einfärben
    gSwapChain->Present(1, 0);                                                  //FrontBuffer und BackBuffer tauschen
}
 
Ich hab sie beim Linker eingetragen?! Ich weiß ja nochnichmal was ich überhaupt mit dieser DLL, von der in MSDN die Rede is, anfangen soll...Die sollte doch von einer Lib verwendet werden, oder? Tut mir leid, aber das bringt mich nich weiter
 
Zuletzt bearbeitet:
hmmm...also das hab ich zuvor tatsächlich noch nich gemacht...aber änert an der Fehlermeldung leider auch nix :( ... totztdem Danke ... Hat sonst noch einer ne Idee?
 
Zitat vom Link, den ich gepostet habe:
You are not linking against the D3D library (D3D10.lib).

Add that library to your linker options (Project properties -> Linker -> Input -> Additional Dependencies). You will need to make sure the library location is in the "Additional Library Directories" path as well.
Das führt mich zu 3 Fragen:
1) Hast du wirklich den exakten Pfad benutzt (z.B. "C:\DirectX\libs\D3D10.lib")?
2) Hast du das DirectX-Verzeichnis bei Projekt->VC++ Verzeichnisse->Bibliotheksverzeichnisse hinzugefügt?
3) Ist das die einzige Fehlermeldung?

Gruss
cwriter

/EDIT: Weisst du was? Ich lasse andere die Arbeit machen :):
http://www.youtube.com/watch?v=FqO5XkIVLj8
1:50 bis 3:40 ist für dich relevant
 
Zuletzt bearbeitet:
1.png2.png3.png4.png5.png6.png

So, das sollte etwas mehr Klarheit in die Sache bringen...

In den VC++ Verzeichnissen habe ich die Pfade der jeweiligen Lib- und Includeordner angegeben, in denen sich die .lib und .h Dateien liegen.

In "Linker->Eingabe" hab ich in den zusätzlichen Abhängigkeiten sowohl den ganzen Pfad ("C:\Programme(x86)\...\d3d10.lib"), als auch, wie im Youtubevideo, das du mir verlinkt hast, zu sehen, nur den Dateinamen, also "d3d10.lib" angegeben. Beide Möglichkeiten haben nichts gebracht...

Übrigens: In dem von dir verlinkten Tutorial werden die Directx_9 Bibilotheken verwendet...ich verwende aber die Directx_10 Bibilotheken, deshalb unterscheiden sich die Namen der Bibilotheken...
Außerdem ist das die einzige Fehlermeldung, bzw steht dann da noch
"fatal error LNK1120: 1 nicht aufgelöste externe Verweise.", die ja durch die vorherige Fehlermeldung entsteht...


Hoffe ihr könnt was damit anfangen...
MfG
LFP
 
Zuletzt bearbeitet:
Welchen Compiler nutzt du?
Dass es Visual Studio ist, sollte klar sein. Express oder kostenpflichtig?
Die Express-Variante kann nicht mit x64 umgehen. Nimm die x86-libs. Wenn du nicht die Express-Variante hast, linke trotzdem mal gegen die x86er libs :)

Gruss
cwriter
 
  • Gefällt mir
Reaktionen: lfp
Jaaa, danke!:):):) Du hattest recht! Ich hab auf x86 umgestellt und es funktioniert!
Vielen Dank! Jetzt kanns endlich weiter gehen mit Directx!
 
Kein Problem.

Könntest du bitte noch unten auf den blau-weissen Haken klicken, damit alle wissen, dass das Thema erledigt ist? Danke.

cwriter
 
Zurück