Une des premières choses que j'ai apprises en tant qu'étudiant est que les applications C ++ ne fonctionnent pas sur différents systèmes d'exploitation. Récemment, alors que je décidais quel IDE utiliser pour la programmation visuelle, j'ai lu que les applications C ++ de Qt fonctionnaient sous Windows et Linux. Alors, quoi de neuf? Les applications C ++ sont-elles multiplates-formes ou non?
Réponses
Trop de publicités?Le code Source compatible. Si je compile le code source, peut-il fonctionner partout.
La compatibilité API/ABI. L'OS fournissent une interface à ses composantes de manière à ce que le code va comprendre?
La compatibilité binaire. Le code est-il capable de s'exécuter sur l'hôte cible?
Le code Source compatible
C++
est une norme qui définit la façon dont les structures, la mémoire, les fichiers peuvent être lus et écrits.
#include <iostream>
int main( int argc, char ** argv )
{
std::cout << "Hello World" << std::endl;
}
Le Code écrit pour traiter les données (par exemple, grep
, awk
, sed
) est en général de la croix-plate-forme.
Lorsque vous souhaitez interagir avec l'utilisateur, les systèmes d'exploitation modernes ont une interface graphique, ce ne sont pas des croix-plate-forme, et la cause de code à écrire pour une plateforme spécifique.
Les bibliothèques comme qt
ou wxWidgets
ont des implémentations pour de multiples plates-formes et de vous permettre de programme pour l' qt
au lieu de Windows
ou iOS
, le résultat étant compatible avec les deux.
Le problème avec ces préservation de l'anonymat des bibliothèques, c'est qu'ils prennent les avantages de la plate-forme de X au loin, dans l'intérêt de l'uniformité de l'ensemble des plates-formes.
Des exemples de ce serait sur Windows
à l'aide de l' WaitForMultipleObjects
de la fonction, ce qui vous permet d'attente pour les différents types d'événements, ou de l' fork
fonction sur UNIX, qui permet à deux copies de vos processus en cours d'exécution avec d'importantes partagée de l'état. Dans l'INTERFACE utilisateur, les formes de l'apparence et au comportement légèrement différent (par ex. color-picker, d'agrandir, de réduire, la capacité à suivre la souris en dehors de votre fenêtre, le comportement des gestes).
Lorsque le travail que vous devez faire est important pour vous, alors vous pouvez vous retrouver à vouloir écrire la plate-forme de code spécifique pour exploiter les avantages de l'application spécifique.
L' C
bibliothèque sqlite
est largement croix-plate-forme de code, mais sa faible niveau de l'OI de la plate-forme, de sorte qu'il peut donner des garanties pour l'intégrité de la base (que les données sont vraiment écrit sur le disque).
Ainsi, les bibliothèques telles que Qt pour faire le travail, ils peuvent produire des résultats qui ne sont pas satisfaisantes, et vous finissez par avoir à écrire du code natif.
La compatibilité API/ABI
Les différentes versions d'UNIX et Windows ont une certaine forme de compatibilité avec les uns des autres. Ceux-ci permettent un binaire pour une version de l'OS pour fonctionner sur d'autres versions de l'OS.
Sous UNIX, le choix de votre construction de la machine définit la compatibilité. Le plus bas de l'OS révision que vous voulez de soutien devrait être votre machine de compilation, et il va produire des binaires compatibles avec les versions mineures successives jusqu'à ce qu'ils font d'une modification de rupture (dénigrent une bibliothèque).
Sur Windows et Mac OS X, vous choisissez un kit de développement logiciel qui vous permet de cibler un ensemble d'OS avec les mêmes problèmes avec les dernières modifications.
Sur Linux, chaque version du noyau est ABI incompatible avec toute autre, et les modules du noyau doit être compilé pour chaque version du noyau.
La compatibilité binaire
C'est la capacité de l'unité centrale pour comprendre le code. C'est plus complexe que vous ne le pensez, comme le x64 puces, peut être capable (selon le support de l'OS) de l'exécution x86 code.
Généralement, un programme C++ est emballé dans un conteneur (PE exécutable, le format ELF) qui est utilisé par le système d'exploitation pour décompresser les sections de code et de données et de charger des bibliothèques. Cela rend le programme final ont à la fois binaire (type de code) et de l'API (format du conteneur) formes d'incompatibilités.
Aujourd'hui aussi, si vous compilez un x86 Application Windows (en ciblant Windows 7 sur Visual Studio 2015), le code peut ne pas s'exécuter si le processeur ne dispose pas d'instructions SSE2 (environ 10 ans CPU).
Enfin, quand Apple a changé de PowerPC, x86, ils ont fourni une couche d'émulation qui a permis à la vieille PowerPC l'exécution de code dans un émulateur sur la plate-forme x86.
Donc, en général, incompatibilité binaire est un quartier glauque. Il serait possible de produire un système d'exploitation qui a identifié des instructions non valides (par exemple, SSE2), et dans l'erreur, émule le comportement, ce qui pourrait être mis à jour que les nouvelles fonctionnalités de sortir, et maintient votre code en cours d'exécution, même si elle est binaire incompatible.
Même si votre plate-forme est incapable de gérer une forme de jeu d'instructions, il pourrait s'en inspirer et de se comporter de façon compatible.
Standard C++ est multi plate-forme dans la "écrire une fois, de compiler n'importe où" le sens, mais pas dans le "compiler une fois, exécuter partout" sens.
Cela signifie que si vous écrivez un programme en C++ standard, vous pouvez compiler et ensuite l'exécuter sur n'importe quelle cible de l'environnement qui a un standard conforme mise en œuvre de C++.
Vous pouvez cependant pas compiler votre programme sur votre machine, expédier le binaire et ensuite espérer qu'il fonctionne sur d'autres cibles. (Du moins, pas en général. Naturellement, on peut distribuer des fichiers binaires à partir de code C++ sous certaines conditions, mais ceux qui dépendent de la cible réelle. C'est un domaine vaste.)
Bien sûr, si vous utilisez supplémentaire, caractéristiques non standard comme gcc est de longueur variable des tableaux ou des bibliothèques tierces, vous pouvez compilation uniquement sur les systèmes qui fournissent ces extensions et les bibliothèques.
Certaines bibliothèques, comme Qt et Boost sont disponibles sur de nombreux systèmes (ces deux sur Linux, Mac et Windows, au moins, je crois), de sorte que votre code va rester de la croix-plate-forme si vous utilisez ceux-ci.
Vous pouvez réaliser que votre source compile sur différentes plates-formes, vous donnant divers fichiers binaires à partir de la même source.
Ce n'est pas "compiler une fois, exécuter partout , avec une VM" comme Java ou C# le faire, mais "écrire une fois, de compiler n'importe où avec un environnement approprié" la façon dont C est fait ça tout le temps.
Depuis la bibliothèque standard ne permet pas de fournir tout ce dont vous pourriez avoir besoin, vous devez regarder pour les bibliothèques tierces pour fournir cette fonctionnalité. Certains cadres -- comme Boost, Qt, GTK+, wxWidgets, etc. - peut fournir. Depuis ces cadres sont écrits d'une manière qu'ils compiler sur différentes plates-formes, vous pouvez obtenir de la croix-plate-forme de fonctionnalité dans le sens précité.
Il ya des choses différentes pour être au courant de si vous voulez que votre code C++ pour être multi-plateforme.
La chose la plus évidente est la source qui fait d' hypothèse sur les types de données. Votre long
pourrait être 32bit ici et 64 bits il. Type de données de l'alignement et de la structure de rembourrage peuvent différer. Il y a des façons de "jouer la sécurité" ici, comme size_t
/ size_type
/ uint16_t
typedefs, etc., et les façons de se tromper, comme wchar_t
et std::wstring
. Il faut de la discipline et une certaine expérience de "get it right".
Pas tous les compilateurs sont créés égaux. Vous ne pouvez pas utiliser toutes les dernières langage C++ fonctions, ou utiliser des bibliothèques qui dépendent de ces caractéristiques, si vous avez besoin de votre source à compiler sur d'autres compilateurs C++. De vérifier la compatibilité de tableau en premier.
Une autre chose est endianess. Juste un exemple, lorsque vous rédigez un flux de nombres entiers de fichier sur une plate-forme (par exemple, x86 ou x86_64), et puis le lire à nouveau sur une autre plate-forme (par exemple, ALIMENTATION), vous pouvez rencontrer des problèmes. Pourquoi voudriez-vous écrire des entiers fichier? Eh bien, UTF-16 est des entiers... encore une fois, de la discipline et une certaine expérience aller un long chemin à faire de ce plutôt indolore.
Une fois que vous avez vérifié toutes ces boîtes, vous devez vous assurez de la disponibilité des bibliothèques que vous avez la base de votre code. Alors qu' std::
qui est sûr (mais voir "pas tous les compilateurs sont créés égaux" ci-dessus), quelque chose d'aussi innocent boost::
peut devenir un problème si vous êtes à la recherche au-delà de l'ordinaire. (J'ai aidé le coup de pouce les gars de fixer un ou deux points de blocage concernant AIX / Visual Age au cours des dernières années, simplement parce qu'ils n'ont pas accès à cette plate-forme pour tester les nouvelles versions...)
Oh, et regarder dehors pour les différents systèmes d'octroi de licence là-bas. Certains cadres de l'amélioration des capacités multi-plateformes -- comme Qt ou Cygwin-ont leurs attaches. Cela ne veut pas dire qu'ils ne sont pas d'une grande aide dans les bonnes circonstances, c'est juste que vous devez être au courant de copyleft / propriétaire exigences d'octroi de licences.
Tout cela étant dit, il y a du Vin ("le Vin n'est pas de l'émulation"), ce qui rend les exécutables compilés pour Windows exécuter sur une variété de Unix-comme les systèmes (Linux, OS X, *BSD, Solaris). Il y a certaines limites de ses capacités, mais il est de mieux en mieux tout le temps.
Oui. Pas de. Peut-être. Qu'est-ce que la croix-plate-forme de code C++? Cross-platform C++ code est un code qui peut être compilé sous différents systèmes d'exploitation sans avoir besoin d'être modifié.
Cela signifie que, si vous utilisez explicitement toute plate-forme à charge des en-têtes, votre code n'est plus de la croix-plate-forme. Qt permet de résoudre ce problème de la manière suivante: ils fournissent des wrappers pour tout ce qui est spécifique à la plateforme. Par exemple, imaginez que vous êtes en utilisant QFile
pour ouvrir/lire/écrire un fichier. Votre code ressemble à
QFile file(filename);
file.open(QFile::ReadOnly);
//other stuff
Vous pouvez compiler ce code sous n'importe quel OS, tant que vous avez un compilateur approprié et bibliothèques Qt pour que les OS. Le code caché sous QFile
vont utiliser le système d'exploitation-fichier approprié des fonctions de gestion, mais qui ne te concerne pas.
Aussi, si vous utilisez uniquement la bibliothèque standard, votre code peut être compilé partout où un compilateur C++ est présent.
Le déjà-compilé, cependant, ne sont pas de la croix-plate-forme de façon, disons, les applications Java sont - par exemple, vous ne pouvez pas compiler une application pour Windows, puis exécuter en sous Linux, vous devrez recompiler votre code sous Linux à la place.
C++ est un langage de programmation. Texte. En tant que telle, elle n'est pas exécutée n'importe où.
Conforme Norme C++ code devrait se comporter de manière égale sur toute plate-forme; "cross-plateforme" si vous le souhaitez. L'écriture (strictement) en respectant le code C++ nécessite pédantisme parce que certaines hypothèses souvent fait avoir des dépendances sur des détails qui sont en finale pour la mise en œuvre réelle et c'est héritée de la cible C++ pour but d'.
Avis nous parlons encore de code C++, pas de programmes C++. En effet, lorsque nous passons à terme "programme", nous n'avons pas plus de garanties parce que nous ne parlons pas de C++ plus; plutôt, la sortie du compilateur. C'est là que la portabilité commence à s'estomper: format de fichier exécutable, ISA, ABI, les routines de bas niveau et ainsi de suite.
Pouvez-vous compter sur qui? Si vous ne pouvez pas, alors vous avez besoin pour l'intégrer à votre programme C++ dans l'environnement, il sera exécuté sur, par le recompiler ou à l'aide de la plate-forme d'éléments spécifiques.