Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

04.01.2009, 16:24

DirectX / Verweis auf nicht aufgelöstes externes Symbol

Also habe ich versucht Schritt für Schritt mich an DirectX heranzuwagen mit dem Tutorial von http://www.directxtutorial.com.

Als ich diesen Code compilieren wollte, kamen 2 Fehlermeldungen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// include the basic windows header files and the Direct3D header file

#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>

// include the Direct3D Library file

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

// global declarations

LPDIRECT3D9 d3d;    // the pointer to our Direct3D interface

LPDIRECT3DDEVICE9 d3ddev;    // the pointer to the device class


// 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


// 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 = (WNDPROC)WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.lpszClassName = L"WindowClass";

    RegisterClassEx(&wc);

    hWnd = CreateWindowEx(NULL,
                          L"WindowClass",
                          L"Our First Direct3D Program",
                          WS_OVERLAPPEDWINDOW,
                          300, 300,
                          640, 480,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);

    ShowWindow(hWnd, nCmdShow);

    // set up and initialize Direct3D

    initD3D(hWnd);

    // enter the main loop:


    MSG msg;

    while(TRUE)
    {
        DWORD starting_point = GetTickCount();

        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT)
                break;

            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        render_frame();

        while ((GetTickCount() - starting_point) < 25);
    }

    // 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);    // create the Direct3D interface


    D3DPRESENT_PARAMETERS d3dpp;    // create a struct to hold various device information


    ZeroMemory(&d3dpp, sizeof(d3dpp));    // clear out the struct for use

    d3dpp.Windowed = TRUE;    // program windowed, not fullscreen

    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    // discard old frames

    d3dpp.hDeviceWindow = hWnd;    // set the window to be used by Direct3D



    // 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);

    return;
}


// this is the function used to render a single frame

void render_frame(void)
{
    // clear the window to a deep blue

    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0);

    d3ddev->BeginScene();    // begins the 3D scene


    // do 3D rendering on the back buffer here


    d3ddev->EndScene();    // ends the 3D scene


    d3ddev->Present(NULL, NULL, NULL, NULL);   // displays the created frame on the screen


    return;
}


// this is the function that cleans up Direct3D and COM

void cleanD3D(void)
{
    d3ddev->Release();    // close and release the 3D device

    d3d->Release();    // close and release Direct3D


    return;
} 

Quellcode

1
2
Fehler    1    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_Direct3DCreate9@4" in Funktion ""void __cdecl initD3D(struct HWND__ *)" (?initD3D@@YAXPAUHWND__@@@Z)".    main.obj
Fehler    2    fatal error LNK1120: 1 nicht aufgelöste externe Verweise.    C:\Users\nanohack\Documents\Visual Studio 2008\Projects\test\Debug\test.exe 


Ich hab mir Microsoft Visual Studio 2008 gedownloaden. Hab die drei DirectX Versionen
Microsoft DirectX SDK (April 2007)
Microsoft DirectX SDK (December 2006)
Microsoft DirectX SDK (November 2008)
Mein system ist ein Vista Business 64bit

Dies sind meine Einträge in der Visual Studio konfiguration:
Includedateien:
C:\Program Files\Microsoft SDKs\Windows\v6.1\Include
C:\Program Files (x86)\Microsoft SDKs\Windows\v5.0\Include
D:\Anwendungen\DirectX 9.0 2006\Include
D:\Anwendungen\DirectX 2006\Include
D:\Anwendungen\DirectX 2008\Include
$(VCInstallDir)include
$(VCInstallDir)atlmfc\include
$(WindowsSdkDir)\include
$(FrameworkSDKDir)include

Bibilioteksdateien:
C:\Program Files\Microsoft SDKs\Windows\v6.1\Lib
C:\Program Files (x86)\Microsoft SDKs\Windows\v5.0\Lib\IA64
D:\Anwendungen\DirectX 9.0 2006\Lib\x64
D:\Anwendungen\DirectX 2006\Lib\x64
D:\Anwendungen\DirectX 2008\Lib\x64
$(VCInstallDir)lib
$(VCInstallDir)atlmfc\lib
$(VCInstallDir)atlmfc\lib\i386
$(WindowsSdkDir)\lib
$(FrameworkSDKDir)lib
$(VSInstallDir)
$(VSInstallDir)lib

Quelldateien:
C:\Program Files\Microsoft Platform SDK\include\mfc
$(VCInstallDir)atlmfc\src\mfc
$(VCInstallDir)atlmfc\src\atl
$(VCInstallDir)atlmfc\src\mfcm
$(VCInstallDir)crt\src

Verzeichnisse ausschliessen:
$(VCInstallDir)include
$(VCInstallDir)atlmfc\include
$(WindowsSdkDir)\include
$(FrameworkDir)$(FrameworkVersion)
$(FrameworkSDKDir)include
$(VCInstallDir)atlmfc\lib
$(VCInstallDir)lib

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

04.01.2009, 16:35

Hast du d3d9.lib gelinkt?
@D13_Dreinig

3

04.01.2009, 16:37

Ja in den Projekteinstellungen, aber:

Quellcode

1
2
3
4
5
6
7
8
Fehler  8   fatal error LNK1120: 7 nicht aufgelöste externe Verweise.  C:\Users\nanohack\Documents\Visual Studio 2008\Projects\test directX\Debug\test directX.exe
Fehler  1   error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_memset" in Funktion "_WinMain@16".  main.obj
Fehler  3   error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__RTC_CheckEsp" in Funktion "_WinMain@16".   main.obj
Fehler  2   error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "@_RTC_CheckStackVars@8" in Funktion "_WinMain@16".   main.obj
Fehler  7   error LNK2001: Nicht aufgelöstes externes Symbol "_WinMainCRTStartup". test directX
Fehler  4   error LNK2001: Nicht aufgelöstes externes Symbol "__RTC_Shutdown". main.obj
Fehler  5   error LNK2001: Nicht aufgelöstes externes Symbol "__RTC_InitBase". main.obj
Fehler  6   error LNK2001: Nicht aufgelöstes externes Symbol "__fltused".  main.obj

4

04.01.2009, 17:13

haste die 64bit bibliotheken unter verzeichnisse angegeben?

5

04.01.2009, 17:19

Yea :D :D :D :D :D :D :D Es geht!!!!!! Danke!!!!

6

04.01.2009, 17:30

Ok find ich gut jetzt geht alles. :D Das einzige deprimierende ist, das morgen wieder die schule anfängt :(

7

04.01.2009, 18:06

Hi
leider hab ich mich zu früh gefreut.

Also ich hab ja das Buch Spieleprogrammieren mit DirectX und C++ gekauft. Nun das beispiel aus der Webseite lief. Doch das Beispiel aus dem Buch liefert immer noch fehler:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
Fehler  9   fatal error LNK1120: 7 nicht aufgelöste externe Verweise.  Debug/Ultris.exe
Fehler  4   error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_DXTraceA@20" in Funktion ""public: long __thiscall CSoundManager::Initialize(struct HWND__ *,unsigned long,unsigned long,unsigned long,unsigned long)" (?Initialize@CSoundManager@@QAEJPAUHWND__@@KKKK@Z)". dsutil.obj
Fehler  5   error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_DirectSoundCreate8@12" in Funktion ""public: long __thiscall CSoundManager::Initialize(struct HWND__ *,unsigned long,unsigned long,unsigned long,unsigned long)" (?Initialize@CSoundManager@@QAEJPAUHWND__@@KKKK@Z)".   dsutil.obj
Fehler  2   error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_DirectDrawCreateEx@16" in Funktion ""public: long __thiscall CDisplay::CreateFullScreenDisplay(struct HWND__ *,unsigned long,unsigned long,unsigned long)" (?CreateFullScreenDisplay@CDisplay@@QAEJPAUHWND__@@KKK@Z)".  ddutil.obj
Fehler  7   error LNK2001: Nicht aufgelöstes externes Symbol "_IID_IDirectSoundNotify".    dsutil.obj
Fehler  6   error LNK2001: Nicht aufgelöstes externes Symbol "_IID_IDirectSound3DListener".    dsutil.obj
Fehler  8   error LNK2001: Nicht aufgelöstes externes Symbol "_IID_IDirectSound3DBuffer".  dsutil.obj
Fehler  3   error LNK2001: Nicht aufgelöstes externes Symbol "_IID_IDirectDraw7".  ddutil.obj


winmm.lib
dxguid.lib
dxerr9.lib
ddraw.lib
dsound.lib
Kernel32.lib
user32.lib
comdlg32.lib
gdi32.lib
shell32.lib

8

04.01.2009, 18:44

Beim nächsten Beispiel aus dem Internet hakt es auch:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
// include the basic windows header files and the Direct3D header file

#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>
#include <d3dx9.h>

// define the screen resolution and keyboard macros

#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

// 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 t_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 = (WNDPROC)WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.lpszClassName = "WindowClass";

    RegisterClassEx(&wc);

    hWnd = CreateWindowEx(NULL, "WindowClass", "Our Direct3D Program",
                          WS_EX_TOPMOST | WS_POPUP, 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)
    {
        DWORD starting_point = GetTickCount();

        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT)
                break;

            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        render_frame();

        // check the 'escape' key

        if(KEY_DOWN(VK_ESCAPE))
            PostMessage(hWnd, WM_DESTROY, 0, 0);

        while ((GetTickCount() - starting_point) < 25);
    }

    // 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 = FALSE;
    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


    return;
}


// 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, t_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);

    return;
}


// this is the function that cleans up Direct3D and COM

void cleanD3D(void)
{
    t_buffer->Release();    // close and release the vertex buffer

    d3ddev->Release();    // close and release the 3D device

    d3d->Release();    // close and release Direct3D


    return;
}


// this is the function that puts the 3D models into video RAM

void init_graphics(void)
{
    // create the vertices using the CUSTOMVERTEX struct

    CUSTOMVERTEX t_vert[] =
    {
        { 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 t_buffer

    d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
                               0,
                               CUSTOMFVF,
                               D3DPOOL_MANAGED,
                               &t_buffer,
                               NULL);

    VOID* pVoid;    // a void pointer


    // lock t_buffer and load the vertices into it

    t_buffer->Lock(0, 0, (void**)&pVoid, 0);
    memcpy(pVoid, t_vert, sizeof(t_vert));
    t_buffer->Unlock();

    return;
}

Quellcode

1
2
3
4
Fehler  4   fatal error LNK1120: 3 nicht aufgelöste externe Verweise.  C:\Users\nanohack\Documents\Visual Studio 2008\Projects\test directX\Debug\test directX.exe
Fehler  3   error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_D3DXMatrixRotationY@8" in Funktion ""void __cdecl render_frame(void)" (?render_frame@@YAXXZ)".  main.obj
Fehler  1   error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_D3DXMatrixPerspectiveFovLH@20" in Funktion ""void __cdecl render_frame(void)" (?render_frame@@YAXXZ)".  main.obj
Fehler  2   error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_D3DXMatrixLookAtLH@16" in Funktion ""void __cdecl render_frame(void)" (?render_frame@@YAXXZ)".  main.obj

9

04.01.2009, 19:03

binde mal d3d9.lib und d3dx9.lib ein

zu spät gesehen das dus im quelltext einbindest :roll:

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

10

04.01.2009, 19:08

Zitat von »"minder"«

C-/C++-Quelltext

1
2
3
// include the Direct3D Library files

#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "d3dx9.lib")

Ich vermute mal, dass sich die diversen DX SDK Versionen gegenseitig irgendwie ausknocken. Beschränk dich doch mal auf eine.

Werbeanzeige