Přešel sem z dev-c++ na wxdev-c++ (wxWidgets zatím používat nehodlám,ale je to prý modernější verze), ale mám problém se SDL. Jakýkoli program co využívá SDL se po kompilaci spustí i s oknem konzole a to je zaprvý neestetický a zadruhý nanic.V dev-c++ to nedělalo a myslel sem že se zas tolik nezměnilo tak v čem je problém?
Fórum › C / C++
SDL ve wxDev-C++
Phoenix píše:#
# Divný je že ta konzole je naprosto neaktivní. Jakýkoli výstup (cout,cerr) se tam neukáže, ani vstup, protože tam není ani kurzor. A taky jde při běhu programu normálně zavřít.
V SDL je veškerý výstup do konzole přesměrován do souboru. Pokud ti je konzolové okno proti srsti, tak to vytvářej jako Win32 aplikaci a kód cpi do WinMain.
Jura píše:#
##Phoenix píše:#
# Divný je že ta konzole je naprosto neaktivní. Jakýkoli výstup (cout,cerr) se tam neukáže, ani vstup, protože tam není ani kurzor. A taky jde při běhu programu normálně zavřít.
##
#V SDL je veškerý výstup do konzole přesměrován do souboru. Pokud ti je konzolové okno proti srsti, tak to vytvářej jako Win32 aplikaci a kód cpi do WinMain.#
#
To ale potom SDL ztrati jednu ze svych hlavnich prednosti...
#ifdef _WIN32
#include <windows.h>
#endif
#include "SDL/SDL.h"
#ifdef _WIN32
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
#else
int main(int argc, char* argv[])
#endif
{
....
return 0;
}
A samozřejmě nastavit v projektu Win32GUI.
Lol nebudete tomu věřit ale dělá to pořád:D win32gui nastavený mám...
jinak kód je:
#include <SDL/SDL.h>
#ifdef _WIN32
#include <windows.h>
#endif
SDL_Surface *screen;
SDL_Event event;
#ifdef _WIN32
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
#else
int main(int argc, char* argv[])
#endif
{
if(SDL_Init(SDL_INIT_VIDEO) < 0){
exit(1);
}
screen = SDL_SetVideoMode(800, 600, 32,SDL_HWSURFACE|SDL_DOUBLEBUF);
if (screen == NULL){
exit(2);
}
bool con=true;
while(con){
if(SDL_PollEvent(&event)){
if(event.type == SDL_QUIT) con=false;
if(event.type == SDL_KEYUP){
if(event.key.keysym.sym == SDLK_ESCAPE) con=false;
}
}
}
return 0;
}
ale problém musí bejt v překladači. Už začínám uvažovat že se vrátim na starý dobrý dev-c++....
tak si odstran tie #ifdef a pouzi len WinMain ako pisal Jura.. ak ti to pojde OK, tak problem je ze nieje definovane _WIN32 .. co by znamenalo ze gcc kompilatoru treba nanutit prepinac -D_WIN32
P.S: skor ako clovek zacne na nieco nadavat ze ake je to zle urobene.. treba zacat kod studovat, nielen ho opisovat. Opisovanim sa clovek nic nenauci a pravdepodobne cielom tvojho snazenia je sa naucit nieco nie?
to sn3d: nebudeš tomu věřit, ale odstranit sem to zkoušel a opravdu mě zajímalo kde se to _WIN32 definuje. Problém je v tom, že se i po odstranění těch podmínek nic nezměnilo... :(
jediná věc co mě napadla je, že to prostě to devko kompiluje v nějakým debugovacim módu a to okno tam k tomu prostě cpe (pořád jsem ale nepochopil k čemu to tam je...)
edit: tím použitím winmain se změnila jedna věc. Po zavření tý příkazovky se zavře celej program. To se normálně s main nestalo.
Nedávno jsem řešil ten samý problém. Přešel jsem z Dev-c++ na wxDev-c++ a když jsem chtěl znovu zkompilovat jednu mojí starší hru v SDL tak mi wxDev
taky vytvářel konzoli.
V klasickým dev-c++ se zobrazování konzole dalo vypnout někde v nastavení projektu. Ve wxDev dato možnost není ale mělo by se to dát změnit v Menu->Nastroje->Nastavení kompilátoru->Typ kodu/optimalizace ->Linker->Nevytvářet konzoli (přepnout na Ano). Mě tato změna ale nefungovala, konzole se mi zobrazovala pořád (možná že někomu jinému tohle nastavení bude fungovat, zkuste to).
Nakonec se mi to podařilo vyřešit. Stačí k projektu přilinkovat -mwindows a konzole by se už vytvářet neměla.
Chtel bych se zeptat na to same ( jak se zbavit konsole po spusteni, mne to ani tak nevadi avsak lide se ptaji co to je a ztraci duveru kdyz nejsem schopen to vyresit ) ale pouzivam code::blocks s minGW a knihovnu -mwindows jsem nikde nenasel.
#19 KIIV
Mockrat dekuji, funguje to na jednicku, ale jeste bych se zeptal jestli to funguje i s jinymi knihovnami ( Glut, CImg ) ? ale patrne asi ano, nebot jde pouze o to nastaveni v C::B Projects a pridani tech #define ... etc ... ? , az bude cas vyzkousim, takze dekuji natisickrat
#21 jozinzbazin
pro co vse to funguje nastaveni projektu netusim.
Druha moznost (tj. schovani konzoloveho okna) by melo fungovat pro cokoliv (tedy pokud si napriklad cygwin neemuluje nejake vlastni). Define je tam mozna jen kdybys to kompiloval nekde pod win XP, je mozne, ze tam neni vubec potreba.
Mne to bez tech #define ... , vyhazuje error, tak to tam zatim budu davat a jeste bych se zeptal jak pridat ikonu do .exe v ide to neni problem : SDL_Surface *icon=SDL_LoadBMP("resources/icon.bmp"); SDL_WM_SetIcon(icon,NULL); pry funguje i neco takovehoto : SDL_WM_SetCaption("Program",icon.ico); ja to vsak pouzivam jen k pojmenovani okna, namisto icon.ico ( musi to byt .ico) pisi normalne NULL, ale mne jde o oikonovani toho bin/Debug/ Program.exe, pamatuji ze se to delavalo pres resources.rc spojeneho se slozkou resources kde to .ico bylo, ale jak se to psalo a pridavalo uz nevim, na toto byl asi opravdu DevCpp lepsi ( tezko soudit )
#23 jozinzbazin
V tom odkazu se jasně píše, že když nechceš automaticky vytvářenou konzoli, tak ten program nekompiluj jako konzolovou aplikaci. Takže změň nastavení projektu a neřeš definy a programové skrývání konzole.
C::B podporuje RC skripty. Normálně do projektu přidej .rc soubor a definuj v něm ikonu.
MAINICON ICON "neco.ico"
#24 gna
Bohuzel mne to stale pise toto :
No such file or directory
No such file or directory
preprocessing failed.
Normalne jsem vytvoril resources.rc a do neho napsal MAINICON ICON "resources/icon.ico"
C::B vytvoril adresar Resources kde umistil muj .rc soubor, vedle toho v hlavnim adresari mam podadresar resources, kde je moje icon.ico asi takto : hlavni -> bin, obj, resources, dale tam je main.c graphics.h+graphics.c etc ... a v bin asi takto : bin/Debug/hlavni.exe + SDL.dll, v obj nasledovne : obj/Debug/ main.o , graphics.o , to je tak vse ( patrne to mam zle umisteno ) a bohuzel anglickym tutorialum nerozumim, protoze anglictinu vubec neovladam , tak nevim ?
C::B by neměl vytvářet adresář. Ten strom v projektu je jen rozlišení typu souboru -- jako tam máš Sources a Headers i když fyzicky tam takové adresáře zřejmě nemáš.
Zkusil bych ten .rc soubor fyzicky umístit do adresáře resources, ale myslím, že i tak jak to máš, by to mělo fungovat.
Někde v nastavení překladače jde zapnout logování, tak to zkus zapnout ať je aspoň vidět, co přesně se to pokouší dělat.
#26 gna
Ano ty adresare doopravdy neexistuji a vse je ulozeno jen v jednom hlavnim vedle main etc... avsak bin, obj a resources existuji ( taktez v hlavnim adresari ) , vyhazuje mi to toto, po prepnuti na Save build log to HTML file when build is finished. v Build option ( pokud je to ono to spravne ? ) .
Pokusim se hledat dale ?
<html>
<head>
<title>SDL_Sinclair build log</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>
<tt>
Build started on: <u>03-06-2019 at 22:38.12</u><br />
Build ended on: <u>03-06-2019 at 22:38.13</u><p />
<b>-------------- Build: Debug in SDL_Sinclair (compiler: GNU GCC Compiler)---------------</b><br />
Compiling: resources.rc<br />
Linking executable: bin\Debug\SDL_Sinclair.exe<br />
<font color="#ff0000">gcc: error: Files\: No such file or directory</font><br />
<font color="#ff0000">gcc: error: \(x86\)\CodeBlocks\MinGW\bin: No such file or directory</font><br />
<font color="#ff0000">windres.exe: preprocessing failed.</font><br />
<font color="#a00000">Process terminated with status 1 (0 minute(s), 0 second(s))</font><br />
<font color="#a00000">3 error(s), 0 warning(s) (0 minute(s), 0 second(s))</font><br />
</tt>
</body>
</html>
JJ, to je ono. Ještě se tam někde dá zapnout logování celých příkazu, ale to tady není potřeba.
Tak problém je s mezerami v cestě [Program Files (x86)]. Nevím, jestli to jde někde poladit, asi bude nejlepší CB úplně přeinstalovat do umístění bez mezer.
#28 gna
Oh-la-la, to je cira utopie, mam tam vice nez 30 projektu vselijak upravenych s ruznymi nastavenimy a podobna divocina, jiz drivejsi prechod na vyssi verzi CB mne stal nemalo programu, jenz jsou dnes jiz nerozchoditelne a velmi toho lituji, neco se dalo prekompilovat ale dost toho bylo ztraceno, nebot si bohuzel nedelam zadne poznamky ( byl jsem zvykly z Borlandiho C++ (90. leta) jenz byl svou jednoduchosti a primitivitou, vlastne uzasne genialne dokonaly a dodnes na nej s nostalgii a slzou v oku vzpominam a nedam dopustit ). Zkusim to probrat jeste s jinymi kapacitami, snad nekdo poradi, bohuzel vsak rady jsou vetsinou typu ( nech plavat C::B a pouzivej Visual Studio ) to vsak neni rada, ale uhybny manevr, nebot sam dobre vim ze jsem to delal a chodilo to.
Windres prostě má (nebo měl; nevím jak poslední verze) problém s mezerami v cestách. Stejně jako spousta dalších programů. MinGW z toho důvodu nepodporuje instalaci do adresáře s mezerami v cestě. CB na to kašle a dovolí nefunkční instalaci. Nejspíš to půjde nějak obejít, ale je to zbytečné patlání.
Nedovedu si představit, jak by jakýkoliv tvůj projekt mohl záviset na umístění překladače tolik, aby to nešlo opravit. Stejně tak nemožnost použití aktuální verze.
Každopádně resources v .exe jsou editovatelné. Při nejhorším tam tu ikonu můžeš po kompilaci přidat ručně. Resource Hacker, ResEdit, nebo další by to měli umět.
#30 gna
Ano, vsiml jsem si take ze v obj/Debug je soubor resource.res, dale nejde mi o prekladac, drive jsem to prekladal rucne g++ prog.o ... etc. ale o nastaveni ktere nebylo universalni ( neco Linux, neco Win etc ... , a byl to nevidany chaos a v podobne situaci jsem i ted ), samozrejmne vyzkousim to rucni pridani, jsem hrozny bordelar a nedelam si poznamky a podle toho vypadaji i ty vysledky
#30 gna
Nevim o jake mezery by melo jit a myslim ze by bylo lepsi vyresit ten problem s mezerami ( dosud nechapu o co by melo jit ) nez nova instalace C::B a rucne s ResEdit atd ... jsem vubec nepochopil, v soucasne dobe je mnoho pseudo programu a pseudo expertu ( jenz doopravdy spise poskozuji nez pomahaji ) a vyskytne-li se problem davaji od toho ruce pryc a vinni druhe atd ... , nerad bych sedl na lep podobnym vykukum, budu tedy muset se s tim poprat sam.
#38 gna
No to ano, ale takto to vytvoril windows, takze myslis pokud vytvorim slozku CodeBlocks primo na C: a nainstaluji tam C::B bude vse v poradku, jinak "prdel" si nedelam snazim se neco naucit a radeji se 100x zeptam nezli pak pozde resit vice problemu ( dvakrat mer a jednou rez ) i prez to ze mne mnozi maji za blbce ( je mi to uplne jedno ). takze zkratka nova instalace Code::Blocks primo na C: ( ten stary ve slozce Program Files (x86) muzu ponechat predpokladam ) potom prilinkovani vseho co bylo v puvodnim ( v podstate to same nastaveni ) vytvoreni noveho projektu SDL a v nem vytvorit soubor .rs jenz bude odkazovat na slozku Resources, kde bude ikona, vse bez mezer, a musi to chodit ! snad jsem to pochopil spravne ?
Tak jsem to zkusil a funguje mi to i při defaultní instalaci do Program Files. Ten problém s mezerami tam teda je, ale při běžném použití CB mi tam celá cesta se špatně escapovanými mezerami nikde nefiguruje.
Možná tam hraje nějakou roli to, že máš CB32 na Win64 (a Program Files se virtualizuje), to netuším. Já jsem zkoušel 32/32 a to je teda OK.
Každopádně když to nainstaluješ do umístění bez mezer, tak prostě problém s mezerami nebude.
Tak jsem zkusil to CB odinstalovat a nainstalovat nekde jinde a pak uz nechodilo nic, musel jsem znovu pridat vsechny lib a includes etc ... , No uz to zase chodi ale tohoto jsem se bal ! , asak problem s ikonou zustal, co mi radite jak to udelat na 64bitech, jiz jsem z toho doopravdy blazen, drive mi to normalne chodilo ????
Ted uz mi vsechno chodi, az zase na tu ikonu, ktrou jsem nacital s SDL a chodila vzdy ( stejny addresar bin/Debug - a ted to nechodi ?, fakt uz nevim ?
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
[SDL] Help — založil WraCkeR
Moderátoři diskuze