Pour essayer de donner une vue légèrement différente aux autres réponses, je répondrai comme ceci.
(Avertissement: je simplifie légèrement les choses, la situation que je donne est purement hypothétique et est écrite comme un moyen de démontrer des concepts plutôt que d'être 100% fidèle à la vie).
Pensez aux choses d'un autre point de vue, imaginez que vous venez d'écrire un système d'exploitation simple avec des capacités de gestion de thread, de fenêtrage et de mémoire de base. Vous voulez implémenter une bibliothèque C ++ pour permettre aux utilisateurs de programmer en C ++ et faire des choses comme créer des fenêtres, dessiner sur des fenêtres, etc. La question est de savoir comment faire cela.
Tout d'abord, puisque C ++ compile en code machine, vous devez définir un moyen d'utiliser le code machine pour interfacer avec C ++. C'est là que les fonctions entrent en jeu, les fonctions acceptent des arguments et donnent des valeurs de retour, elles fournissent donc un moyen standard de transférer des données entre différentes sections de code. Ils le font en établissant quelque chose connu sous le nom de convention d'appel .
Une convention d'appel indique où et comment les arguments doivent être placés en mémoire afin qu'une fonction puisse les trouver lors de son exécution. Lorsqu'une fonction est appelée, la fonction appelante place les arguments en mémoire, puis demande au CPU de passer à l'autre fonction, d'où il fait ce qu'il fait avant de revenir à l'endroit d'où il a été appelé. Cela signifie que le code appelé peut être absolument n'importe quoi et cela ne changera pas la façon dont la fonction est appelée. Dans ce cas cependant, le code derrière la fonction serait pertinent pour le système d'exploitation et fonctionnerait sur l'état interne du système d'exploitation.
Ainsi, plusieurs mois plus tard, toutes vos fonctions du système d'exploitation sont triées. Votre utilisateur peut appeler des fonctions pour créer des fenêtres et dessiner dessus, il peut créer des threads et toutes sortes de choses merveilleuses. Voici le problème cependant, les fonctions de votre système d'exploitation seront différentes des fonctions de Linux ou des fonctions de Windows. Vous décidez donc que vous devez donner à l'utilisateur une interface standard afin qu'il puisse écrire du code portable. C'est là qu'intervient QT.
Comme vous le savez presque certainement, QT dispose de nombreuses classes et fonctions utiles pour faire le genre de choses que font les systèmes d'exploitation, mais d'une manière qui semble indépendante du système d'exploitation sous-jacent. La façon dont cela fonctionne est que QT fournit des classes et des fonctions qui sont uniformes dans leur apparence pour l'utilisateur, mais le code derrière les fonctions est différent pour chaque système d'exploitation. Par exemple, QApplication :: closeAllWindows () de QT appelle en fait la fonction de fermeture de fenêtre spécialisée de chaque système d'exploitation en fonction de la version utilisée. Dans Windows, il appellerait très probablement CloseWindow (hwnd) tandis que sur un système d'exploitation utilisant le système X Window, il pourrait potentiellement appeler XDestroyWindow (affichage, fenêtre).
Comme il est évident, un système d'exploitation comporte de nombreuses couches, qui doivent toutes interagir via des interfaces de nombreuses variétés. Il y a de nombreux aspects que je n'ai même pas abordés, mais les expliquer tous prendrait beaucoup de temps. Si vous êtes davantage intéressé par le fonctionnement interne des systèmes d'exploitation, je vous recommande de consulter le wiki de développement d'OS .
Gardez à l'esprit que la raison pour laquelle de nombreux systèmes d'exploitation choisissent d'exposer des interfaces à C / C ++ est qu'ils compilent en code machine, ils permettent de mélanger les instructions d'assemblage avec leur propre code et ils offrent une grande liberté au programmeur.
Encore une fois, il se passe beaucoup de choses ici. Je voudrais continuer à expliquer comment les bibliothèques comme les fichiers .so et .dll ne doivent pas être écrites en C / C ++ et peuvent être écrites en assembleur ou dans d'autres langages, mais je pense que si j'ajoute plus, je pourrais aussi bien écrire un article entier, et autant que j'aimerais faire, je n'ai pas de site pour l'héberger.