Portabilité
| freemaul |
Posté le 29 Oct 2008 à 14:34
|
|
![]() Messages : 174 GCPoints : 50213 |
Bonjour tout le monde, J'ai une petite question à laquelle je n'ai pas trouvé de réponse (sinon je ne la poserait pas) en ayant chercher un minimum sur le net. Donc en gros je compte me relancer un peu dans le programmation C et C++ mais surtout faire des application PORTABLE. Mon problème est donc le suivant, je prévient avant tout je commence par les bases, je veut donc créer une application de cryptage toute conne de fichier, application qui affiche des message dans le terminal. elle marche trés bien, puis pour rajouter un peu de fun je me suis dit "pourquoi ne pas rajouter de la couleur", or linux et windows ne fonctionne pas de la même facon de ce coté !! j'ai donc une fonction qui marche sous windows et une autre sous linux j'ai donc penser faire quelque chose du genre : Code : #if __WIN32__ #define color() color_windows() #else #define color() color_linux() #endif or il fondrait donc que je compile pour linux et pour windows, mais ce que je voudrais faire c'est UNE SEULE compilation ! n'y a-t-il donc pas un moyen de savoir dans quel OS s'exécute l'exécutable ? pour faire quelque chose du genre : Code :
void color(void)
{
if (WIN=1)
color_windows()
else
color_linux()}
}
"La vie n'a pas de prix, mais elle coûte chère"
|
|
| Mod |
Posté le 29 Oct 2008 à 15:01
|
|
![]() Messages : 4954 GCPoints : 2100823 |
Windows et Linux utilise des formats exécutables différents, chose qui est fixé à la compilation. PE (Portable Executable) pour Windows et ELF (Executable and Linkable File) pour Linux, pas certain pour ce dernier. Tu ne pourras pas donc pas compiler en une fois fois les deux formats. Il te faudra forcément faire deux compilations séparées, le système à base de constantes comme tu le précises en premier est celui communément utilisé. | |
| freemaul |
Posté le 29 Oct 2008 à 15:07
|
|
![]() Messages : 174 GCPoints : 50213 |
ha zut ! il me semblais qu'il existait des exécutable pouvant être exécuter sous différents OS, bon bha je vais devoir me tapper les deux compil alor tampis ^^ merci
"La vie n'a pas de prix, mais elle coûte chère"
|
|
| Mod |
Posté le 29 Oct 2008 à 15:12
|
|
![]() Messages : 4954 GCPoints : 2100823 |
Pas à ma connaissance, ou tout du moins en dehors de cas particuliers. Wine qui peut faire fonctionner les exécutables Windows, par exemple. De manière générale, on a Windows d'un côté, avec PE pour les exécutables, MSCOFF pour les librairies, etc, et le reste de l'autre avec ELF et consorts. |
|
| freemaul |
Posté le 29 Oct 2008 à 15:22
|
|
![]() Messages : 174 GCPoints : 50213 |
ok, mais donc si j'utilise les #if __win32__ , .... avec les fonction spécifique à windows et les fonction spécifique à linux, on peut quand même qualifié le code de portable ??
"La vie n'a pas de prix, mais elle coûte chère"
|
|
| Mod |
Posté le 29 Oct 2008 à 15:31
|
|
![]() Messages : 4954 GCPoints : 2100823 |
Quand on parle de code portable, c'est quand on n'a pas besoin de recoder un programme ou des parties de programmes pour le porter sur un autre système. Exemple avec des applications utilisant DirectX qui ne fonctionne que sous Windows (il faudra donc tout recoder pour espérer le porter), là où OpenGL aura un code identique sous Windows et Linux. Dans la mesure où tu écris une fonction différente pour chaque système d'exploitation, ce n'est pas réellement du code portable. |
|
| dstar |
Posté le 30 Oct 2008 à 08:16
|
|
![]() Messages : 56 GCPoints : 25718 |
Citation :
A mon avis, non, je suis d'accord avec Mod ! Les commandes du pré-compilateur (ou pré-processeur, c'est la même chose) servent à la mise en page du code source avant que celui-ci ne soit réellement compilé (les commandes qui commencent par un #). Quand tu utilises l'instruction #if, tu demandes au pré-compilateur d'inclure la bonne fonction C selon l'environnement de compilation (dans ton cas, Windows ou Linux). Donc, selon cet environnement, ce n'est pas le même code source qui va être compilé. On parle de code portable lorsque le même code peut être compilé sous différents environnements. Ce n'est pas le cas ici, tu as juste regroupé 2 codes différents dans le même fichier source. dstar
dstar
|
|
| freemaul |
Posté le 30 Oct 2008 à 10:00
|
|
![]() Messages : 174 GCPoints : 50213 |
OK, parce que par exemple dans le code source de la librairies SDL, il y a des #if __win32__ , or il me semblais que c'était considéré comme portable. Mais alors faire une application portable se résume à n'utiliser que les bibliothèque standar ?? on peut pas faire grand chose de portable alor , ou j'ai raté un épisode ^^
"La vie n'a pas de prix, mais elle coûte chère"
|
|
| dstar |
Posté le 30 Oct 2008 à 10:40
|
|
![]() Messages : 56 GCPoints : 25718 |
Citation :
Non, la bibliothèque SDL n'est pas portable. Ce sont les applications qui utilisent la SDL qui le sont. Ces applications appellent les fonctions C de la bibliothèque SDL indépendamment de la plate-forme sur laquelle elles vont fonctionner (la plate-forme cible). Et la bibliothèque implémente ces fonctions de façon dépendante de la plate-forme cible. Le code des applications est donc indépendant de la plate-forme cible et peut donc être considéré comme portable. D'une façon générale, quand on veut faire une application dite portable sur différentes plate-formes, et que cette application doit néanmoins comporter des parties qui sont spécifiques aux plate-formes cibles, on architecture l'application de façon à séparer ces parties spécifiques dans des modules ou des bibliothèques à part. Comme ça, seuls ces modules ou bibliothèques doivent être modifiés pour effectuer le portage, le reste du code restant le même. Et c'est ce que font les applications qui utilisent la SDL. Les parties du code qui sont spécifiques à une plate-forme sont situés dans la SDL, et le reste de l'application peut être écrite de façon indépendante de la plte-forme, et donc portable. dstar
dstar
|
|
| gouessej |
Posté le 30 Oct 2008 à 12:47
|
|
![]() Messages : 337 GCPoints : 64624 |
Citation :
Disons qu'en C/C++, la portabilité est à la charge du programmeur pour l'essentiel (c'est autre chose si on se restreint au C ANSI)... Tu peux faire des applications relativement portables avec ça mais après, c'est une question de priorité; si tu veux surtout que ce soit portable peu importe le langage, C et C++ ne sont pas les langages plus adaptés pour ça. Tu parles seulement de Windows et de Linux mais il y a aussi Unix et Macintosh. Tout dépend de ce que tu souhaites faire mais même en C, la gestion des signaux n'est pas portable. Il est vrai que des bibliothèques comme SFML, SDL, OpenAL et OpenGL facilitent la tâche.
Dernière édition le 30 Oct 2008 à 12:49
|
|
| Mod |
Posté le 30 Oct 2008 à 12:50
|
|
![]() Messages : 4954 GCPoints : 2100823 |
Citation :
Il me semble d'ailleurs que sous Windows, SDL utilise DirectX6, et OpenGL1 sous Linux. |
|
| freemaul |
Posté le 30 Oct 2008 à 13:43
|
|
![]() Messages : 174 GCPoints : 50213 |
OK , merci pour ces précisions, j'y voit plus claire. @dstar : en fait c'est un peu ce que je vais essayerr de faire, j'ai découper mon source en plusieur fichier, et seul certaines fonction change en fonction de l'OS , mais ni le nom ni les paramètres de la fonction ne change, seuleument celle-ci ne fait pas appel au mêmes librairies. @gouessej : je parle que de linux et windows car ce sont les seul OS sur lesquels j'ai déja un peu travaillé, les autres me sont totalement inconnu mis à part leur nom. mais donc aprés vos précision je peut dire que mon but n'est plus de faire un code portable, mais un code compilable sur au moin Windows et Linux. @mod : pour opengl sous linux c'est bien ca, pour windows j'ai pas regardé Aprés je ne compte pas respecter à la lettre la norme AINSI ( sinon je n'rais pas trés loin) mais plutot de respecter autant que possible les normes AINSI et POSIX1. Sinon une petite question ayant un léger rapport : vus que je code sur PC portable (fournit avec vista Je pensais donc installer une machine virtuel sur le PC , puis lancer mon live-cd (où meme installer le live-cd sur la machinne virtuelle) pour compiler le code sans avoir à rebooter ma machinne à chaque fois. Or la machinne virtuel que j'ai trouvé (virtualpc je croit) ne va pas trés vite (15minute pour lancer linux - 83heures annoncés pour l'installer
"La vie n'a pas de prix, mais elle coûte chère"
|
|
| freemaul |
Posté le 31 Oct 2008 à 10:09
|
|
![]() Messages : 174 GCPoints : 50213 |
Bon finalement j'ai installer virtualbox , compatible avec vista , et qui plus est, reconnait ma carte résaux wifi (alors que unbuntu ne la reconnait pas si je le lance sans machinne virtuelle) !
"La vie n'a pas de prix, mais elle coûte chère"
|
|
| noob4ever |
Posté le 31 Oct 2008 à 18:00
|
|
![]() Messages : 295 GCPoints : 48742 |
Mod a écrit :
Outre le rendu il faut aussi prendre en compte les API utilisées pour le fenêtrage, API Win32 sous windows et X11 sous linux. freemaul a écrit :
Faudrait faire des recherches sur un compilateur croisé pour linux.
What did C:/DARTHVADER said to C:/DARTHVADER/LUKESKYWALKER ?
I'm your folder |
|
| SEB |
Posté le 31 Oct 2008 à 18:16
|
|
![]() Messages : 554 GCPoints : 103313 |
C'est du C ou du C++ ?? alors GCC :D il est souvent intégré de base dans les distrib.
NextGine : 3D games engine
Nombre de lignes actuel : 77683 |
|
| freemaul |
Posté le 31 Oct 2008 à 22:31
|
|
![]() Messages : 174 GCPoints : 50213 |
pour l'instant je me limite au C, et oui j'utilise gcc (qui bizarement était bien présent dans la distribution mais non installer par défaut) et grâce à virtualbox je navigue trés facilement entre linux et windows pour tester le code sur les deux machinne assez facilement.
"La vie n'a pas de prix, mais elle coûte chère"
|
|
| Darktib |
Posté le 03 Nov 2008 à 12:06
|
|
![]() Messages : 4017 GCPoints : 347288 |
C'est aussi ce que je ferait pour l'éditeur (machine virtuelle) mais il existe aussi l'alternative du compilo : j'avais vu sur le site officiel que gcc pouvait compiler des exe win sur linux et des exe linux sur windows. C'est d'ailleurs une technique hyper-importante, notament pour les machines ayant une puissance tres limitée (téléphones portables, etc...) |
|
| noob4ever |
Posté le 03 Nov 2008 à 12:28
|
|
![]() Messages : 295 GCPoints : 48742 |
J'ai jamais essayé mais avec les bin utils de gcc ( qui supporte la cross compilation ) tu peux générer des executable windows. http://www.dumbbell.fr/howto/win32-cross-compilation.fr.html
What did C:/DARTHVADER said to C:/DARTHVADER/LUKESKYWALKER ?
I'm your folder |
|
| freemaul |
Posté le 03 Nov 2008 à 18:48
|
|
![]() Messages : 174 GCPoints : 50213 |
@noob4ever : En fait c'est plutot de compiler sus windows pour linux qui m'intéresserais, donc je vais tenter quelques recherches sur la cross compilation, mais de toute facon, vu qu'il vaut mieu tester ces programmes, il faudras de toute facon passer sous linux à un moment où à un autre, et pour le debuggage autant pouvoir compiler depuis linux, donc l'utilisation de la machinne virtuelle semble à mon gout plus simple.
"La vie n'a pas de prix, mais elle coûte chère"
|
|
| Cpl.Bator |
Posté le 28 Déc 2008 à 13:47
|
|
![]() Messages : 17 GCPoints : 8751 |
Petit up. Citation :
Dans ce cas , rien n'est portable alors. Tout code portable utilise des fonctions / procédures propre à chaque os , prenons comme exemple glut , cette lib permet de faire du fenestrage avec OpenGL , or , sous Linux , X11 ce n'est pas du Windows , les programmeur de Glut ne sont pas des magiciens , ils ont forcement usé des directives du pré-compilateur # Ceux qui utilisent glut , pour eux , rien ne change , il ouvre une fenêtre de la même façon sous Windows , mac , linux. seul le contenu de la fonction change suivant l'os.comme pour la SDL. @+ |
|






