Partage
  • Partager sur Facebook
  • Partager sur Twitter

Début sur la cross-compilation

Anonyme
    24 août 2018 à 10:13:44

    Bonjour à tous,

    Je suis débutant en C++ et je dois faire un programme pour un appareil tournant sur une version allégée de Linux qui possède un processeur ARM. Je dois donc compiler mon petit projet (qui se résume à un fichier main.cpp qui appelle display.cpp où l'on retrouve la fonction std::cout << "Hello world!" << std::endl). Etant donné que je travaille sur Mac, j'utilise Xcode et donc c'est lui qui gère tout le processus de compilation. Or, il ne compile (d'après ce que j'ai pu voir) pas pour les processeurs ARM.

    J'ai regarder quelques tuto pour essayer la cross-compilation mais je ne comprends pas énormément... Car je n'ai jamais réalisé de CMake, Makefile ou autres choses du genre.

    Avez-vous des liens d'aide, des conseils, etc. à me donner pour bien faire une cross-compilation?

    D'avance, merci. 

    • Partager sur Facebook
    • Partager sur Twitter
      24 août 2018 à 17:15:34

      Heu ...

      Installe toi un IDE digne de ce nom, et laisse le prendre en charge la compilation.
      Ce genre de détail technique n'a pas à être ta préoccupation.

      • Partager sur Facebook
      • Partager sur Twitter
        24 août 2018 à 22:27:45

        je suis dans un cas similaire(je me pose des questions sur la compile et les makefiles.
        on m a donné ce lien ca a l air pas mal
        • Partager sur Facebook
        • Partager sur Twitter
          25 août 2018 à 2:05:09

          Tu accèdes à ton appareil via ssh ?

          Si oui, je te conseil d'utiliser Netbeans et de créer un service distant.

          Cela  te permettra de compiler directement sur la cible.

          Voir:

          http://touchardinforeseau.servehttp.com/siteweb/20172018/ICN/ALGORITHME_ET_PROGRAMMATION/ajoutServiceRaspi.pdf

          et

          http://touchardinforeseau.servehttp.com/siteweb/20172018/ICN/ALGORITHME_ET_PROGRAMMATION/ProjetRaspiSenseHat.pdf

          • Partager sur Facebook
          • Partager sur Twitter
            25 août 2018 à 17:38:40

            Salut,

            La première chose, quand tu veux effectuer une compilation croisée, c'est d'être sur de disposer du compilateur qui te permettra de générer le code binaire spécifique à la cible que tu veux atteindre.

            Pour ce faire, il y a de très nombreuses possibilités:

            1- installer un compilateur croisé : Gcc, par exemple (mais c'est aussi le cas de clang) est fourni dans une foule de versions qui permettent d'atteindre un nombre incroyable de cibles différentes.

            Sur ma debian, une recherche dans les différents paquets portant sur

            apt-cache search gcc |grep ARM

            me donne, la liste suivante:

            gcc-arm-none-eabi - GCC cross compiler for ARM Cortex-A/R/M processors
            gcc-arm-none-eabi-source - GCC cross compiler for ARM Cortex-A/R/M processors (source)

            Je sais donc que, si je veux pouvoir compiler mon code pour cibler un ARM, je devrai installer les paquets gcc-arm-none-eabi, et autres dépendances

            Le principal avantage, c'est que l'on peut utiliser les outils auxquels nous sommes habitués, sans avoir à changer de système d'exploitation, et qu'il suffit généralement "d'un réglage" à effectuer pour effectuer la compilation croisée.

            Le gros inconvénient, c'est que l'exécutable obtenu ayant été compilé pour une cible qui n'est pas notre système d'exploitation, nous ne pourrons pas le tester "directement" : il faudra transférer le résultat obtenu sur "le système adéquat".

            A titre d'info, tu pourras trouver pas mal de données sur la gestino d'une compilation croisée au travers de CMake directement sur leur wiki ;)

            2- installer un "dual-boot" : Il est possible -- si on dispose de suffisamment d'espace disque -- d'installer plusieurs systèmes d'exploitation sur un ordinateur.

            On peut donc décider d'installer -- par exemple -- une version de Windows et une (ou plusieurs) version(s) de linux et profiter de grub pour sélectionner le système d'exploitation que l'on veut utiliser.

            Cette solution n'est- malheureusement -- à ma connaissance pas praticable lorsque l'on veut travailler sur ARM, car les PC n'utilisent pas cette architecture.

            De plus, si on veut passer d'un système à l'autre, nous nous trouvons face à l'obligation de redémarrer completement le système, et cela prend "un temps bête".

            3- Installer une machines virtuelle :

            Depuis des années, il est possible de trouver des logiciels (comme Virutal Box et autres) qui nous permettent de créer une "machine virtuelle" sur notre système.

            Pour faire simple, on va dédier une partie des ressources de notre ordinateur à ce programme qui se chargera de faire tourner "un autre système d'exploitation".

            Toute l'exécution de cet "autre système d'exploitation" se fait alors dans un "espace protégé", qui ne risquera -- a priori -- absolument pas d'aller "foutre la m...de" dans notre système "de base".

            L'énorme avantage par rapport au "multi boot" est qu'il suffit de démarrer une machine virtuelle "quand on en a besoin" et que, si les ressources sont suffisantes, il est même tout à fait envisageable d'en avoir plusieurs qui fonctionnent en même temps.

            4- travailler "en externe" :

            S'il est possible de mettre ta machine de développement et ta machine cible en réseau (et que ta machine cible dispose de suffisemment de ressources pour ce faire :waw:), tu peux toujours installer le compilateur "qui va bien" sur la machine cible et de lancer le processus de compilation -- directement sur la machine cible -- au travers du réseau (par exemple par SSH)

            L'énorme avantage que tu en tireras sera que, tout se faisant directement sur la machine cible, tu pourras profiter directement de sa configuration particulière (note que c'est aussi le cas pour le multi-boot et les machines virtuelles).

            L'inconvénient, c'est que tu vas sans doute te retrouver face à un problème de "double gestion" et de "mise à jour" de tes fichiers: il faudra systématiquement veiller à ce que les fichiers sur ta machine cible soient parfaitement synchronisés par rapport aux fichiers qui se trouve sur ta "machine de travail", étant entendu que -- a priori -- tu modifieras les sources sur ta machine de travail.

            L'utilisation de systèmes de gestion de versions concurrentes (hein? qui a parlé de git ? ) peut s'avérer d'une aide efficace sur ce point ;)

            Sans oublier, bien sur, que l'installation du compilateur, du client du système de gestion concurrentes et des sources sur la machine cible nécessitera "pas mal d'espace disque" au niveau de la machine cible...

            En conclusion:

            On se rend compte qu'il n'y a pas vraiment de "solution miracle" lorsque l'on travaille sur une machine donnée et que l'on veut créer un exécutable pour une cible différente; que le plus facile est -- toujours -- de faire tout le travail directement sur la "machine ciblée".

            Seulement, ce n'est pas toujours faisable.  Il faut donc choisir la solution qui s'avère être la "mieux adaptée" à la situation dans laquelle tu te trouves ;)

            • Partager sur Facebook
            • Partager sur Twitter
            Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
              26 août 2018 à 23:06:53

              En général un appareil ne vient pas comme ça, il est accompagné d'un SDK qui contient en principe le cross compilateur, le debugger et les outils pour déployer sur la cible... Peut être que RTFM a du sens finalement...

              -
              Edité par int21h 26 août 2018 à 23:08:12

              • Partager sur Facebook
              • Partager sur Twitter
              Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug

              Début sur la cross-compilation

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown