IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Transfert de code Linux/Window - grosscompilation


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Ecole Ingénieur
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ecole Ingénieur

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Transfert de code Linux/Window - grosscompilation
    Bonjour tout le monde ,

    Je viens de finir il y a peu de temps la programmation d'un jeu de puissance4. Je l'ai programmé sous Linux (Ubuntu) en utilisant la bibliothèque libsx pour la partie graphique (une bibliothèque pas très connue et bien adaptée aux débutants : http://www.nada.kth.se/~sungam/libsx/libsx.html ) avec gcc. J'aimerais maintenant transférer mon code sous Windows, du coup comment dois-je procéder ? La librairie libsx existe-elle sur Windows (je suppose que nan) ? Dans ce cas je dois réécrire toute la partie graphique du code avec une bibliothèque logicielle adéquate sous Windows ?

    Merci beaucoup !!!

  2. #2
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 352
    Points
    4 352
    Par défaut
    En supposant que ta lib n'existe pas sous windows.

    Tu as la version bête et méchante, tu lances une compilation sous windows, tu attends que ça casse, tu corriges et tu boucles sur le début de ma phrase.

    Une autre possibilité serait de prendre une bibliothèque windows qui fait la même chose (du graphique c'est ça ?), et de faire un wrapper pour les fontions de libsx que tu utilises qui appeleraient les fonctions de la bibliothèque windows (pas sûr que ça soit possible ou simple dans ton cas).

    Ou tu peux utiliser les symboles de compilation conditionnelle.

    Si la lib n'existe pas sous windows, je conseillerais d'utiliser les symboles de compilation conditionnelle, ça permet de tout garder dans un même projet. Il existe plusieurs méthodes d'utilisation, à toi de voir ce que tu préfères.

  3. #3
    Candidat au Club
    Homme Profil pro
    Ecole Ingénieur
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ecole Ingénieur

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonjour ,

    Merci pour ta réponse

    Pour ta première idée (compilation sous Windows) comment puis-je compiler mon code sous Windows car sous Linux je compile via gcc, et sous Windows j'ai l'habitude d'utiliser Code:Blocks un IDE que vous devez connaître mais je ne vois pas comment je pourrais compiler car les fonctions de la bibliothèque que j'ai utilisé (libsx) ne seront pas reconnus. Ou je me trompe ? Et je ne comprends pas bien ce que tu entends par "corriger" ? Désolé, je suis un peu débutant :$$

    D'autre part, je ne sais pas ce qu'est un wrapper et cette méthode semble effectivement trop compliqué à mettre en oeuvre alors je l'essaierai en dernier.

    Sinon pour ton dernier argument, je n'ai pas non plus tellement compris. Je ne connais pas la compilation conditionnelle, je peux me renseigner dessus mais le fait est que je n'appréhende pas en quoi cela va m'aider à combler ma librairie manquante, en quoi cette compilation conditionnelle peut m'aider ?

    De plus, je me suis renseigné et effectivement libsx n'existe pas sous Windows. J'ai donc essayé de trouver un équivalent : j'ai remarqué SDL et SFML. Cependant en me renseignant sur l'utilisation de ces 2 librairies, j'ai vu que SFML introduisait des notions d'orienté objet que je ne maîtrise pas encore bien. Et quant à la SDL, ce qui était commode avec ma libraire, c'est que je pouvais dessiner des cercles alors que là il faut tous les fabriquer or pour un puissance 4 cela peut s'avérer compliquer.

    J'ai également tenté la cross-compilation : fabriquer un .exe sous Linux, j'ai réussi pour des programmes simples qui ne demandait pas l’utilisation de librairie (qui ne fonctionnait qu'en console) mais dès qu'il y a une librarie à inclure, je ne parviens pas à créer l'exécutable (sur Internet, il n'explique la cross-compilation qu'avec la librarie QT). J'ai donc abandonné cette idée.

    Voilà pour le résumé, encore merci à toi

  4. #4
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 352
    Points
    4 352
    Par défaut
    Je fais 2 posts pour mettre dans des réponses différentes des méthodes très différentes.
    Citation Envoyé par PulseWidth Voir le message
    Pour ta première idée (compilation sous Windows) comment puis-je compiler mon code sous Windows car sous Linux je compile via gcc, et sous Windows j'ai l'habitude d'utiliser Code:Blocks un IDE que vous devez connaître mais je ne vois pas comment je pourrais compiler car les fonctions de la bibliothèque que j'ai utilisé (libsx) ne seront pas reconnus.
    C'est le but. Quand tu vas lancer la compilation, gcc va envoyer un message d'erreur sur la première fonction de libsx qu'il trouve. Supposont que ce soit la fonction libsx_fun1(arg1, arg2). Il ne te reste plus qu'à recoder une fonction libsx_fun1 qui prenne les mêmes arguments et fasse la même chose.

    Citation Envoyé par PulseWidth Voir le message
    D'autre part, je ne sais pas ce qu'est un wrapper et cette méthode semble effectivement trop compliqué à mettre en oeuvre alors je l'essaierai en dernier.
    C'est un peu la même chose qu'au dessus, mais là tu recodes la fonction libsx_fun1 pour qu'elle appelle une fonction de la SDL qui fait la même chose. C'est parfois casse pieds car les paramètres d'entrée et de sortie ne sont pas du même type mais c'est relativement courant comme méthode.

  5. #5
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 352
    Points
    4 352
    Par défaut
    Là on rentre dans du plus lourd, car on doit s'intéresser au fonctionnement du compilateur.
    Personnellement je trouve ça mieux, mais tu sors d'une réflexion centrée sur le C pour devoir réfléchir à ton architecture ce qui n'est pas forcément facile au début.

    Citation Envoyé par PulseWidth Voir le message
    Sinon pour ton dernier argument, je n'ai pas non plus tellement compris. Je ne connais pas la compilation conditionnelle, je peux me renseigner dessus mais le fait est que je n'appréhende pas en quoi cela va m'aider à combler ma librairie manquante, en quoi cette compilation conditionnelle peut m'aider ?
    La compilation conditionnelle utilise des fonctions de preprocessing. Quand tu lances la compilation, si tu as un #define toto 2 dans le code pendant la phase de preprocessing tous les toto du code sont remplacés par 2. Mais tu peux faire beaucoup beaucoup plus avec ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    if(ma_var == truc){
    // du code qui marche sur tous les OS
    ma_var+=bidule;
    #ifdef __WIN32__
    /* du code qui sera compilé si tu es sur un OS windows 32 bits */
    #endif
    #ifdef __UNIX__
    /* du code qui sera compilé si tu es sur un unix, utilisant libsx */
    #endif
    #ifdef __WINDOWS__
    /* du code qui sera compilé si tu es sur un windows, en plus du code compilé sur win32 bits donc attention aux #ifdef */
    #endif
    // et on continue le programme
    }
    Ca peut rapidement devenir un peu fouilli donc attention.
    http://sourceforge.net/p/predef/wiki/OperatingSystems/
    En plus de #ifdef et #endif, tu peux aussi utiliser #elif, qui permet de faire du "else if" plutôt qu'une suite de "if".


    Si ça devient trop fouilli, avec des #ifdef partout, tu as (encore) une autre solution, mais qui demande de faire un peu modulaire. C'est à dire que tu dois avoir quelque part un fichier interface.c avec l'interface de ton programme. En plus de ce fichier, tu crées un fichier interface_win.c, qui contient l'interface windows. Au moment de compiler, si tu es sous windows tu demandes au compilateur d'utiliser interface_win.c, si tu es sous Linux tu demandes au compilateur d'utilise interface.c. Ca évite de mélanger le code qui devient plus facile à lire, mais tu vas dupliquer certaines parties du code, donc si tu corriges un bug sous Linux, il faut également voir si tu ne dois pas le corriger sous Windows.

    Ou tu peux mettre un gros #ifdef au début du fichier interface.c, mais personnellement je trouve que c'est pas très beau, ça fait des fichiers à rallonge et tu peux te mélanger les pinceaux en corrigeant du code au mauvais endroit.

    Citation Envoyé par PulseWidth Voir le message
    J'ai également tenté la cross-compilation : fabriquer un .exe sous Linux, j'ai réussi pour des programmes simples qui ne demandait pas l’utilisation de librairie (qui ne fonctionnait qu'en console) mais dès qu'il y a une librarie à inclure, je ne parviens pas à créer l'exécutable (sur Internet, il n'explique la cross-compilation qu'avec la librarie QT). J'ai donc abandonné cette idée.
    Je ne sais plus exactement quels sont les options à passer à gcc mais ce n'est pas très compliqué, il te faut la bibliothèque (et pas librarie ) pour windows sur ton linux et la rajouter à ta ligne de commande gcc. Une fois que gcc a la bibliothèque, il peut cross-compiler.

    C'est un peu long et compliqué d'un premier abord, mais tu plein de choses à y apprendre au passage.
    Pour un début je conseillerais d'utiliser une des deux méthodes du premier message (recodage ou wrapper).

  6. #6
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,

    la dernière mise à jour de la libsx remonte apparemment à 2003. On trouve dans le README :
    Libsx -- the Simple X library -- is a lightweight wrapper library sitting on top of the Athena Widget set [...]
    Cela signifie que tu ne pourras pas recompiler la bibliothèque directement sous windows. Tu peux éventuellement essayer d'utiliser cygwin/X pour bénéficier d'un serveur X sous windows. Ou redévelopper ton application avec une bibliothèque graphique multi-plateforme (SDL, GTK+, ...).

  7. #7
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 707
    Points : 43 795
    Points
    43 795
    Par défaut
    The LibSX library is a simplified interface to X and the Athena Widget set. See the README file for more introductory information.
    C'est donc une surcouche à X-Window. Il te faut en plus les widgets Athena (xaw). Tu vas en chier. Tu peux utiliser X-Window sur Windows, Xaw est disponible en source je crois, c'est peut-être possible.

    Si tu dois recoder, utilises Qt ou Gtk, tu pourras comme cela facilement porter ton projet de Linux à Windows et vice-versa.

Discussions similaires

  1. transposer du code Linux <--> Windows
    Par ylyco dans le forum wxWidgets
    Réponses: 3
    Dernier message: 07/08/2011, 21h59
  2. Guides d'installation de Code::Blocks (Windows - Linux)
    Par Arnaud F. dans le forum Code::Blocks
    Réponses: 0
    Dernier message: 16/02/2008, 22h22
  3. Réponses: 13
    Dernier message: 13/03/2005, 20h56
  4. [Linux]différence de code de windows vers unix sous eclipse
    Par skywalker3 dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 05/01/2005, 14h11
  5. OmniORB : code sous Windows et Linux
    Par debug dans le forum CORBA
    Réponses: 2
    Dernier message: 30/04/2002, 17h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo