Ĺadny brzuch
Witam. Chciałbym się dowiedzieć jak można napisać program, który wykona dany kod w zależności od systemu operacyjnego, tzn. chodzi mi tu głównie o windows, linux. Widziałem kiedyć coś takiego:
#IFDEF windows #include <iostream> #include <winsock.h> #ENDIF #IFDEF linux #include <iostream> #include <socket.h> #ENDIF
Może jakoś trzeba z tego skorzystać ? ja już nie wiem. Proszę o pomoc. Z góry thx.
Użytkownik pura89 edytował ten post 26 czerwiec 2007, 15:35
Z tego co mi wiadomo to dyrektywy kompilatora (np. ifdef) zależą od ... kompilatora :). Także to czy będzie obsługiwane #IFDEF WINDOWS czy nie będzie zależało od tego jakiego kompilatora używasz. Np. Lazarus dla Object Pascala obsługuje #IFDEF WINDOWS :). Ogólnie sprawdź w dokumentacji kompilatora jakie są dostępne dyrektywy (pewnie #ifdef linux / wndows będzie działać w większości). Ogólnie dobrze myślisz tylko sprawdź czy dokładnie takie wpisy Cię interesują :).
A działa to na zasadzie, że jak kompilujesz pod linuxem to kompilator nie patrzy na blok #ifdef windows a pod windowsem go będzie kompilować.
//@Down: Hmm, ja właśnie tak to odczytałem. Ale jeżeli pytacz chce zrobić program skompilowany na różne platformy, a nie kompilowany pod różnymi platformami, to raczej nie C :P (chyba że wine Go urządza - wtedy nic nie musi przerabiać ^^)
Użytkownik Ali240 edytował ten post 26 czerwiec 2007, 18:35
hmm coś takiego będzie trudne do zrobienia bo format wykonywalny windowsa i linuxa są różne :)
a to co tam masz w przykładzie to jest po to że jak kod jest pisany w zamyśle jako wieloplatformowy to w zależności czy kompilujemy na linuksie czy na widnowsie(gdzieś wcześniej sobie robimy #define WINDOWS czy też LINUX albo jak tam wolisz) i poprostu zgodnie z dyrektywami preprocessora się kompiluje jak trzeba :)
hmm coś takiego będzie trudne do zrobienia bo format wykonywalny windowsa i linuxa są różne :)
a to co tam masz w przykładzie to jest po to że jak kod jest pisany w zamyśle jako wieloplatformowy to w zależności czy kompilujemy na linuksie czy na widnowsie(gdzieś wcześniej sobie robimy #define WINDOWS czy też LINUX albo jak tam wolisz) i poprostu zgodnie z dyrektywami preprocessora się kompiluje jak trzeba :)
Hmm... A nie dało by rady zrobić pliku skryptowego np. uruchom.bat, a w jego wnętrzu wstawić odpowiednie rozkazy konsoli rozpoznawania systemu? -sam tego jeszcze nie próbowałem, ale wiem że ten typ pliku - *.bat jest rozpoznawany pod Windowsem (tam musi mieć rozszerzenie bat żeby go Windows wykonał) i pod Linuxem (rozszerzenie bat nie jest wymagane).
Tak sobie pomyślałem, że możnaby wstawić najpierw rozkazy konsoli dla Windowsa i jeżeli wywali błędy że nie ten system to od razu będą wykonywane komendy konsoli dla Linuxa. Z tego co mi wiadomo Linux nie robi specjalnych problemów jeżeli napotka jakieś niezrozumiałe komendy, które są dla Windowsa.
Podsumowując myślałem o czymś takim (wnętrze uruchom.bat):
ECHO# dla Windowsa start.exe ECHO# dla Linuxa ./configure make make install start
Acha! No i oczywiście start.exe to jest kolejny plik do uruchomienia, z którym poradzi sobie Windows, natomiast reszta to jest to z czym bez problemu powinien poradzić sobie Linux. :)
Pozdrawiam!
P.S. Debian rządzi!!! :D
Użytkownik dowhilebegin edytował ten post 27 czerwiec 2007, 11:02
Tutaj raczej nie chodzi o to jak skompilować jednym skryptem tylko o przygotowanie do kompilacji na różnych platformach (ifdef'em) lub odpalanie jednego skompilowanego na różnych platformach (bez np. wine raczej niewykonywalne). Myślę że trzeba poczekać aż autor sprecyzuje o co mu chodzi bo tak to można jeszcze długo wymieniać ;).
P.S. Ubuntu rox - szybciej są wydawane poprawki ;). No ale jakby nie było Debian based ;].
#ifdef __WIN32__ std::cout << "Hello Windows, you suck!\n"; #else std::cout << "Hello Other, I love you!\n"; #endif
__WIN32__ jest zdefiniowane, jeśli kompilator pracuje pod Windowsem. Oprócz tego znalazłem kilka innych (przeglądając źródła SDL :)):
__MWERKS__
__BEOS__
__MACOS__
__MACOSX__
__SYMBIAN32__ //Chyba mam kolejne:
__GNUC__
Użytkownik pbnan edytował ten post 27 czerwiec 2007, 13:27
no ale przedewszystkim problem jest w tym że w wielu rzeczach trzeba pisać dwa różne kody ... czyli więcej do klepania
a ja wpadłem na taki pomysł - http://llvm.org/ - może o to chodzi :)
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
#IFDEF windows #include <iostream> #include <winsock.h> #ENDIF #IFDEF linux #include <iostream> #include <socket.h> #ENDIF
Może jakoś trzeba z tego skorzystać ? ja już nie wiem. Proszę o pomoc. Z góry thx.
Użytkownik pura89 edytował ten post 26 czerwiec 2007, 15:35
Z tego co mi wiadomo to dyrektywy kompilatora (np. ifdef) zależą od ... kompilatora :). Także to czy będzie obsługiwane #IFDEF WINDOWS czy nie będzie zależało od tego jakiego kompilatora używasz. Np. Lazarus dla Object Pascala obsługuje #IFDEF WINDOWS :). Ogólnie sprawdź w dokumentacji kompilatora jakie są dostępne dyrektywy (pewnie #ifdef linux / wndows będzie działać w większości). Ogólnie dobrze myślisz tylko sprawdź czy dokładnie takie wpisy Cię interesują :).
A działa to na zasadzie, że jak kompilujesz pod linuxem to kompilator nie patrzy na blok #ifdef windows a pod windowsem go będzie kompilować.
//@Down: Hmm, ja właśnie tak to odczytałem. Ale jeżeli pytacz chce zrobić program skompilowany na różne platformy, a nie kompilowany pod różnymi platformami, to raczej nie C :P (chyba że wine Go urządza - wtedy nic nie musi przerabiać ^^)
Użytkownik Ali240 edytował ten post 26 czerwiec 2007, 18:35
hmm coś takiego będzie trudne do zrobienia bo format wykonywalny windowsa i linuxa są różne :)
a to co tam masz w przykładzie to jest po to że jak kod jest pisany w zamyśle jako wieloplatformowy to w zależności czy kompilujemy na linuksie czy na widnowsie(gdzieś wcześniej sobie robimy #define WINDOWS czy też LINUX albo jak tam wolisz) i poprostu zgodnie z dyrektywami preprocessora się kompiluje jak trzeba :)
hmm coś takiego będzie trudne do zrobienia bo format wykonywalny windowsa i linuxa są różne :)
a to co tam masz w przykładzie to jest po to że jak kod jest pisany w zamyśle jako wieloplatformowy to w zależności czy kompilujemy na linuksie czy na widnowsie(gdzieś wcześniej sobie robimy #define WINDOWS czy też LINUX albo jak tam wolisz) i poprostu zgodnie z dyrektywami preprocessora się kompiluje jak trzeba :)
Hmm... A nie dało by rady zrobić pliku skryptowego np. uruchom.bat, a w jego wnętrzu wstawić odpowiednie rozkazy konsoli rozpoznawania systemu? -sam tego jeszcze nie próbowałem, ale wiem że ten typ pliku - *.bat jest rozpoznawany pod Windowsem (tam musi mieć rozszerzenie bat żeby go Windows wykonał) i pod Linuxem (rozszerzenie bat nie jest wymagane).
Tak sobie pomyślałem, że możnaby wstawić najpierw rozkazy konsoli dla Windowsa i jeżeli wywali błędy że nie ten system to od razu będą wykonywane komendy konsoli dla Linuxa. Z tego co mi wiadomo Linux nie robi specjalnych problemów jeżeli napotka jakieś niezrozumiałe komendy, które są dla Windowsa.
Podsumowując myślałem o czymś takim (wnętrze uruchom.bat):
ECHO# dla Windowsa start.exe ECHO# dla Linuxa ./configure make make install start
Acha! No i oczywiście start.exe to jest kolejny plik do uruchomienia, z którym poradzi sobie Windows, natomiast reszta to jest to z czym bez problemu powinien poradzić sobie Linux. :)
Pozdrawiam!
P.S. Debian rządzi!!! :D
Użytkownik dowhilebegin edytował ten post 27 czerwiec 2007, 11:02
Tutaj raczej nie chodzi o to jak skompilować jednym skryptem tylko o przygotowanie do kompilacji na różnych platformach (ifdef'em) lub odpalanie jednego skompilowanego na różnych platformach (bez np. wine raczej niewykonywalne). Myślę że trzeba poczekać aż autor sprecyzuje o co mu chodzi bo tak to można jeszcze długo wymieniać ;).
P.S. Ubuntu rox - szybciej są wydawane poprawki ;). No ale jakby nie było Debian based ;].
#ifdef __WIN32__ std::cout << "Hello Windows, you suck!\n"; #else std::cout << "Hello Other, I love you!\n"; #endif
__WIN32__ jest zdefiniowane, jeśli kompilator pracuje pod Windowsem. Oprócz tego znalazłem kilka innych (przeglądając źródła SDL :)):
__MWERKS__
__BEOS__
__MACOS__
__MACOSX__
__SYMBIAN32__ //Chyba mam kolejne:
__GNUC__
Użytkownik pbnan edytował ten post 27 czerwiec 2007, 13:27
no ale przedewszystkim problem jest w tym że w wielu rzeczach trzeba pisać dwa różne kody ... czyli więcej do klepania
a ja wpadłem na taki pomysł - http://llvm.org/ - może o to chodzi :)