+Netbeans
Czy NetBeans, środowisko programistyczne stworzone przez twórców Javy dla programistów Javy, nadal można tylko w ten sposób postrzegać? ZDECYDOWANIE NIE.
Wystarczy spojrzeć na stronę projektu aby się przekonać, że z bardzo dużym powodzeniem można wykorzystać to IDE do pracy m.in. z Java SE, JavaFX, Java, Ruby, C/C++ oraz PHP.
Co mnie ostatnio bardzo pozytywnie bardzo zaskoczyło, to wykorzystanie NetBeans do PHP – szybkie porównanie z tym, co oferuje Eclipse (+PDT) i muszę przyznać, że jestem pod wrażeniem.
Nie o NetBeans PHP miał być ten wpis, dlatego zaprezentuję teraz jak skonfigurować NetBeans do pracy z cpp.
Potrzebne będą trzy rzeczy:
- Kompilator, linker, biblioteki CPP, które dostępne są w moim ulubionym nuwen MinGW distro,
- MSYS, konsola i narzędzia naśladujące środowisko unixowe,
- NetBeans z pluginem do C/CPP.
MinGW
Wykorzystana dystrybucja nuwen’a jest szybka w instalacji (rozpakowanie plików) i zawiera wszelkie podstawowe narzędzia oraz te bardziej specjalne, ale o tym można się dowiedzieć na stronie dystrybucji. Przede wszystkim jednak dla gamedeveloper’ów, zawiera dużo bibliotek do obsługi grafiki 3D, m.in. DirectX, OpenGL (Glee), SDL jak również do obsługi dźwięku (OGG), grafiki 2D (JPEG, PNG) oraz archiwów (zlib, libbzip2).
Istotne jest to, jak należy “zainstalować” tą dystrybucję MinGW, żeby była widoczna dla Eclipse. Otóż możemy rozpakować podaną dystrybucję gdziekolwiek (najlepiej bez białych znaków w strukturze katalogów – żadnych spacji), lecz jeśli nie będzie to standardowe miejsce C:\MinGW\ to musimy utworzyć na dysku C takie katalogi: C:\MinGW\bin, ponieważ CDT wyszukuje zainstalowanego toolchain’a od MinGW m.in. po istnieniu podanej ścieżki na dysku C (najprostszy wariant).
To oczywiście nie wszystko – w zmiennej systemowej PATH należy dodać lokalizację rozpakowanej dystrybucji ze ścieżką do podkatalogu bin, czyli dla przykładu, jeśli rozpakowaliśmy MinGW w katalogu D:\PRO, to ustawiamy w PATH ścieżkę do D:\PRO\MinGW\bin.
Żeby sprawdzić czy wszystko jest ok, należy uruchomić ponownie komputer lub wylogować się z profilu – dopiero wtedy zmiany w zmiennej systemowej PATH zostaną uwzględnione w systemie.
Sprawdzić możemy wpisując w wierszu poleceń CMD ( będąc w dowolnym katalogu) polecenie:
g++ -v
Jeśli wszystko jest ok, to powinniśmy otrzymać parę linii komunikatu kończącego się np. tak:
gcc version x.y.z ,
gdzie x,y,z to numer wersji kompilatora gcc.
MSYS
MSYS można pobrać z oficjalnej strony projektu, jednak polecam ściągnąć instalator MSYS dla Gnustep, który zawiera najnowsze wersje potrzebnych narzędzi i nie trzeba ich ręcznie wybierać z listy do instalacji.
Podkatalog \bin MSYS także musimy dodać do zmiennej systemowej PATH, dodatkowo musi on być wcześniej niż katalog \bin MinGW, ponieważ narzędzie make.exe musi być znalezione w MSYS, a nie w MinGW (ewentualnie dla pewności można usunąć make.exe z podkatalogu \bin w MinGW)
NetBeans
Jeśli posiadamy już NetBeans bez C/CPP, możemy łatwo dodać ten plugin z menu Tools / Plugins, wyszukując go po nazwie cpp:
Ostatecznie, po restarcie IDE, plugin do C/CPP powinien znaleźć się na liście zainstalowanych:
Teraz należy skonfigurować NetBeans do pracy z nowym toolchain MinGW.
W tym celu przechodzimy do menu Tools / Options / C/C++, gdzie znajdziemy pustą listę Tool Collection.
Klikamy Add… i uzupełniamy informację o toolchain:
Następnie konfigurujemy ustawienia toolchain’a (kompilator, debugger):
i sprawdzamy przyciskiem Versions z prawej strony, czy wymagane narzędzia zostały w systemie odnalezione:
W tym momencie możemy stworzyć nowy projekt C/CPP lub wybrać jeden z dostępnych (tutorial) i spróbować go skompilować.
Przykład aplikacji DirectX
Dla przykładu, stworzymy prostą aplikację wykorzystującą DirectX:
#include <d3d9.h> LPDIRECT3D9 pD3D9 = NULL; LPDIRECT3DDEVICE9 pD3D9Device = NULL; HRESULT InitialiseD3D(HWND hWnd) { // First of all, create the main D3D object. If it is created successfully // we should get a pointer to an IDirect3D8 interface. pD3D9 = Direct3DCreate9( D3D_SDK_VERSION ); if ( !pD3D9 ) { MessageBox( 0, "Direct3DCreate9() - Failed", 0, 0 ); return 0; } //Get the current display mode D3DDISPLAYMODE d3ddm; if(FAILED(pD3D9->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm))) { return E_FAIL; } D3DPRESENT_PARAMETERS D3Dpp; ZeroMemory( &D3Dpp, sizeof(D3Dpp) ); D3Dpp.Windowed = TRUE; D3Dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; if ( FAILED( pD3D9->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3Dpp, &pD3D9Device ) ) ) { MessageBox( 0, "CreateDevice() - Failed", 0, 0 ); if(pD3D9 != NULL) { pD3D9->Release(); pD3D9 = NULL; } return 0; } return S_OK; } void Render() { if(pD3D9Device == NULL) { return; } // Clear the backbuffer to blue pD3D9Device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0); // Begin the scene pD3D9Device->BeginScene(); // Fill in here the rendering of other objects // End the scene pD3D9Device->EndScene(); // Fill back and front buffers so that back buffer will be visible on screen pD3D9Device->Present(NULL, NULL, NULL, NULL); } void CleanUp() { if(pD3D9Device != NULL) { pD3D9Device->Release(); pD3D9Device = NULL; } if(pD3D9 != NULL) { pD3D9->Release(); pD3D9 = NULL; } } void MainLoop() { // Enter the main loop MSG msg; BOOL bMessage; PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE); while(msg.message != WM_QUIT) { bMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE); if(bMessage) { // Process message TranslateMessage(&msg); DispatchMessage(&msg); } else { Render(); // No message to process -> render the scene } }// while } // The windows message handler LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_DESTROY: PostQuitMessage(0); return 0; break; case WM_KEYUP: switch (wParam) { case VK_ESCAPE: // Escape key pressed -> exit DestroyWindow(hWnd); return 0; break; } break; }// switch return DefWindowProc(hWnd, msg, wParam, lParam); } // Application main entry point INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT) { //Register the window class WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WinProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, "DirectX Project", NULL }; RegisterClassEx(&wc); // Create the application's main window HWND hWnd = CreateWindow("DirectX Project", "DirectX9 APP : Netbeans + MinGW", WS_OVERLAPPEDWINDOW, 50, 50, 500, 500, GetDesktopWindow(), NULL, wc.hInstance, NULL); // Initialize Direct3D if(SUCCEEDED(InitialiseD3D(hWnd))) { // Show window ShowWindow(hWnd, SW_SHOWDEFAULT); UpdateWindow(hWnd); //Start game running: Enter the game loop MainLoop(); } CleanUp(); UnregisterClass("DirectX Project", wc.hInstance); return 0; }
Musimy jeszcze dodać bibliotekę statyczną libd3d9.a, którą znajdziemy w podkatalogu \lib katalogu instalacji MinGW – klikamy na właściwości projektu, przechodzimy do linkera i wybieramy Add library…
Kompilujemy, uruchamiamy, wyłączamy – zadanie wykonane.
Chyba, że pojawi się nam następujący błąd:
make: *** [.validate-impl] Error 255
Oznacza to, że używamy złego make.exe, więc musimy się upewnić, że jest to make.exe z katalogu MSYS, a nie z katalogu MinGW.
Brak komentarzy.




