web-dev-qa-db-fra.com

Compilation multiplateforme C ++

J'utilise Windows 7 - 32bit système d'exploitation.

Je veux compiler mon simple code source C++ en exécutable pour tous les OS et architectures.

Je veux compiler pour cela les systèmes d'exploitation ci-dessous à partir de mon système d'exploitation.

  • Windows 32
  • Windows 64
  • Linux 32
  • Linux 64
  • OSX 32
  • OSX 64

Est-ce possible ou non?

Note: J'ai besoin de compiler C++ pour tous les OS avec seulement Win7 32 bits.

21
Chandra Nakka

Il est beaucoup plus facile de le compiler sur le système d'exploitation cible que de le compiler de manière croisée. Ce dont vous avez besoin, c'est d'une chaîne d'outils pour chaque système d'exploitation et d'un outil de création. CMake possède de puissantes capacités de compilation croisée. Ce n'est pas une nécessité, mais cela vous fera économiser de l'argent: obtenez un logiciel de virtualisation (par exemple, VMWare Player est gratuit) et exécutez-le sur un autre système d'exploitation.

Je recommanderais clang (OSX), gcc (Linux), TDM gcc (Windows) comme chaînes d'outils (MSVC est également agréable, mais n'est pas gratuit). La différence entre 32 bits et 64 bits ne devrait pas être le problème. Lorsque vous travaillez avec différents compilateurs, je vous conseille de vous en tenir à la norme en activant les drapeaux de compilation les plus pédants sur chacun.

Je vous recommanderais également d'avoir un serveur d'intégration continue quelque part avec un client pour chaque cible et architecture de système d'exploitation. Cela soulagera la douleur des modifications incompatibles que vous effectuez dans un système d'exploitation. Et vous pourrez également assurer l'installation par le gestionnaire de packages ou l'installateur.

Recherchez simplement sur le Web des lectures supplémentaires sur la compilation croisée, les chaînes d'outils et l'intégration continue.

31
Stefan Weiser

Vous avez besoin d'un système de construction comme les outils automatiques ou CMake, et je recommande ce dernier. Il existe un Python utilitaire appelé cookiecutter qui vous permet de créer un projet de modèle CMake/C++ simple en utilisant Python (le BoilerplatePP template). Dans ce lien, vous avez les instructions pour l'utiliser pour créer un projet de départ. Le projet initial devrait ressembler à ceci:

$ tree cpp/
cpp/
├── CMakeLists.txt
├── README.md
├── include
│   └── Calculator.hpp
├── src
│   ├── CMakeLists.txt
│   └── Calculator.cpp
├── test
│   ├── CMakeLists.txt
│   └── CalculatorTests.cpp
└── thirdparity
    └── catch
        └── include
            └── catch.hpp

CMake prend en charge la compilation croisée à partir de la version 2.6. Lisez cet article pour avoir un aperçu de ce problème. Bonne chance.

10
aaragon

Vous pouvez commencer à utiliser CMake et préparer votre projet pour les compilateurs dans tous les systèmes d'exploitation.

Dans certains cas particuliers, vous devez adapter votre code, y compris les vérifications des préprocesseurs sur le système d'exploitation que vous utilisez. Par exemple:

#ifdef WIN32
//do some stuff for Windows
#Elif __Apple__
//do some stuff for Apple
#Elif __linux__
//do stuff for Linux
#endif

Ici, à ce lien , vous pouvez trouver la liste de toutes les macros prédéfinies.

Pour tout compiler de manière croisée en utilisant uniquement votre Win7 32 bits, vous pouvez utiliser le compilateur croisé GCC. Jusqu'à présent, GCC ou CLANG sont les seuls compilateurs disponibles sur Windows, Mac et Linux. Suivez ce wiki si vous souhaitez construire votre projet pour d'autres cibles plutôt que seulement Windows 32 bits

GCC

6
madduci

Je pense que la réponse courte est oui mais ensuite nous avons des détails (le diable se cache toujours dans les détails). En bref, nous avons deux questions: la compatibilité des sources et la compatibilité des chaînes d'outils.

  1. Compatibilité de la chaîne d'outils. Ici, nous devons considérer 3 parties: compilateur, bibliothèques et outils de construction. Heureusement, l'outil de construction existe et même pas un. C'est une marque célèbre dans toutes les réincarnations, cmake, ninja, etc. Je préfère cmake comme la plus simple mais vous pouvez toujours ramasser l'arme de votre choix. Compilateur. GCC est un bon choix, mais aujourd'hui nous avons CLang qui est également un bon choix. Je parierais que CLang est une solution plus intéressante, plus propre et mieux prise en charge sous Windows. Un autre bon choix est Intel C++/C mais cela coûte cher. Une autre façon est d'utiliser différents compilateurs pour différents systèmes et ce n'est pas non plus un mauvais choix. Boost do it et boost team est l'un des meilleurs. Vous pouvez creuser dans les configurations de boost et obtenir beaucoup de macroses et en-têtes intéressants. Bibliothèque standard C++ et autres bibliothèques. C'est l'une des choses les plus délicates. C++ est quelque peu standard mais peut avoir des problèmes après la mise à jour. D'autres bibliothèques doivent être construites avec le compilateur que vous utilisez pour le système particulier. Soyez donc prêt à distribuer votre logiciel avec le bundle de bibliothèque. Une autre bonne option consiste à s'appuyer sur des bibliothèques multiplateformes tierces comme Qt ou WxWidgets.

  2. La compatibilité des sources est étroitement disponible avec une implémentation particulière de divers sous-systèmes d'exploitation. Par exemple, les threads, la mémoire partagée, les sockets, les E/S à diffusion groupée, l'interface graphique. Habituellement, ce n'est pas très compliqué, mais il faut du temps pour écrire tous ces wrappers.

2
Tanuki

Comme indiqué précédemment CMake est la meilleure chaîne d'outils de compilation multiplateforme. Il génère des solutions Visual Studio, Makefiles, projets Eclipse, etc. pour toutes les plateformes que vous avez mentionnées ci-dessus

Vous pouvez également essayer SCons , c'est un peu moins connu, mais un peu plus simple

1
user707779

cmake est utilisé comme méta-langage car il résume toutes les dépendances de la chaîne d'outils et du système d'exploitation; bien sûr c'est utile mais peut être difficile à utiliser la première fois ...

Ce dont vous avez vraiment besoin, c'est ce que cmake utilise de toute façon: 1. un compilateur pour chaque système d'exploitation cible 2. un makefile bien écrit

vous pouvez activer les indicateurs pour modifier le comportement du makefile ou si vous voulez vraiment la version allégée, vous appelez simplement le bon compilateur (pour le système d'exploitation souhaité) lors de la construction du code.

1
Pandrei

Golang propose compilation croisée facile (spécifiez $ GOOS et $ GOARCH et lancez "go build"); selon vos besoins (par exemple, avez-vous besoin d'un RTOS dur), il peut être le bon outil pour le travail.

1
Homer Simpson

En utilisant Windows 10, c'est en fait facile maintenant avec CLion IDE et WSL . Vous pouvez utiliser votre installation de WSL pour compiler votre code à l'aide d'une chaîne d'outils de compilation Linux (généralement GCC) tout en travaillant sur un hôte Windows. Ensuite, vous pouvez bien sûr également passer à un Windows chaîne d'outils comme MinGW ou utilisez Visual Studio avec MSVC pour compiler à nouveau pour obtenir votre binaire Windows.

À la fin de la journée, cela vous donne les deux binaires alors qu'il semble que vous n'utilisiez que Windows tout le temps. Certaines personnes disent que WSL est l'une des meilleures choses que Microsoft a fait ces dernières années. En effet, c'est génial pour multiplateforme C/C++ développement.

Veuillez noter que la compilation pour OS X n'est pas inclus, vous devrez donc disposer d'un Mac ou d'une machine virtuelle exécutant OS X, malheureusement.

1
BullyWiiPlaza

Il suffit de souligner que, techniquement parlant, si votre question est que vous souhaitez compiler le même code sur Windows 7 mais ciblant ces autres OS , alors ce dont vous avez besoin est un compilateur croisé pour toutes ces différentes cibles qui fonctionneront sur Windows. À cette fin, je pense que votre meilleur pari est d'utiliser Cygwin ou MinGW32, et de construire des compilateurs croisés pour vos différentes architectures à partir de la source GCC. GCC (et éventuellement clang) sont les seuls compilateurs a) gratuits et b) capables de prendre en charge toutes vos cibles. Construire un compilateur croisé n'est pas facile, mais devrait être réalisable. Quelques références:

Les réponses qui disent "utilisez CMake!" vous donnent de bons conseils, dans la mesure où ils vous encouragent à utiliser un système de génération qui peut prendre en charge la création de votre source en mode natif sur tous ces systèmes, mais si vous ne pouvez vraiment construire sur Windows 7, alors utiliser CMake ne vous fera aucun bien.

0
clemej