Portabilité

freemaul Message lu Posté le 29 Oct 2008 à 14:34 Bulle
Avatar de freemaul
Explorateur

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 Message lu Posté le 29 Oct 2008 à 15:01 Bulle
Avatar de Mod
Webmaster

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 Message lu Posté le 29 Oct 2008 à 15:07 Bulle
Avatar de freemaul
Explorateur

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 Message lu Posté le 29 Oct 2008 à 15:12 Bulle
Avatar de Mod
Webmaster

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 Message lu Posté le 29 Oct 2008 à 15:22 Bulle
Avatar de freemaul
Explorateur

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 Message lu Posté le 29 Oct 2008 à 15:31 Bulle
Avatar de Mod
Webmaster

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 Message lu Posté le 30 Oct 2008 à 08:16 Bulle
Avatar de dstar
Explorateur

Messages : 56
GCPoints : 25718

Citation :

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



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 Message lu Posté le 30 Oct 2008 à 10:00 Bulle
Avatar de freemaul
Explorateur

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 Message lu Posté le 30 Oct 2008 à 10:40 Bulle
Avatar de dstar
Explorateur

Messages : 56
GCPoints : 25718

Citation :

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



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 Message lu Posté le 30 Oct 2008 à 12:47 Bulle
Membre Avancé

Messages : 337
GCPoints : 64624

Citation :

Donc en gros je compte me relancer un peu dans le programmation C et C++ mais surtout faire des application PORTABLE.


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 Message lu Posté le 30 Oct 2008 à 12:50 Bulle
Avatar de Mod
Webmaster

Messages : 4954
GCPoints : 2100823

Citation :

Non, la bibliothèque SDL n'est pas portable.



Il me semble d'ailleurs que sous Windows, SDL utilise DirectX6, et OpenGL1 sous Linux.
freemaul Message lu Posté le 30 Oct 2008 à 13:43 Bulle
Avatar de freemaul
Explorateur

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 :proud: ), vous me conseiller quoi pour compiler le code pour linux ? Si possible j'aimerais éviter de l'installer sur le PC, par contre je posséde déja une version live-cd de unbuntu.

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 :shocked: ), et enplus m'affiche un message comme quoi elle n'est pas compatible avec vista :shocked: ,et je n'en ait pas trouver que se dise compatible vista.
"La vie n'a pas de prix, mais elle coûte chère"
freemaul Message lu Posté le 31 Oct 2008 à 10:09 Bulle
Avatar de freemaul
Explorateur

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 Message lu Posté le 31 Oct 2008 à 18:00 Bulle
Avatar de noob4ever
Explorateur

Messages : 295
GCPoints : 48742

Mod a écrit :


Citation :

Non, la bibliothèque SDL n'est pas portable.

Il me semble d'ailleurs que sous Windows, SDL utilise DirectX6, et OpenGL1 sous Linux.


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 :

Sinon une petite question ayant un léger rapport : vus que je code sur PC portable (fournit avec vista ), vous me conseiller quoi pour compiler le code pour linux ? Si possible j'aimerais éviter de l'installer sur le PC, par contre je posséde déja une version live-cd de unbuntu.


Faudrait faire des recherches sur un compilateur croisé pour linux.
What did C:/DARTHVADER said to C:/DARTHVADER/LUKESKYWALKER ?

I'm your folder
SEB Message lu Posté le 31 Oct 2008 à 18:16 Bulle
Avatar de SEB
Membre Evolué

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 Message lu Posté le 31 Oct 2008 à 22:31 Bulle
Avatar de freemaul
Explorateur

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 Message lu Posté le 03 Nov 2008 à 12:06 Bulle
Avatar de Darktib
Membre Ultime

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 Message lu Posté le 03 Nov 2008 à 12:28 Bulle
Avatar de noob4ever
Explorateur

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 Message lu Posté le 03 Nov 2008 à 18:48 Bulle
Avatar de freemaul
Explorateur

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 Message lu Posté le 28 Déc 2008 à 13:47 Bulle
Avatar de Cpl.Bator
Nouveau Membre

Messages : 17
GCPoints : 8751
Petit up. :smile:


Citation :

Non, la bibliothèque SDL n'est pas portable.



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.

@+ :grin:


Répondre
GameCorp - Site d'apprentissage et d'entraide à la création de jeux vidéo.
XHTML Valid 1.1 - Page générée en 0.0549 secondes