GNU/Linux >> Tutoriels Linux >  >> Linux

(C/C++) Comment générer un fichier exécutable pouvant fonctionner à la fois sous Windows et Linux ?

Il n'y a aucun moyen d'avoir un seul exécutable natif compilé à partir d'une source C++ qui fonctionne sur différentes plates-formes. Je ne vous crois pas que le même fichier exécutable est exécuté sur Windows et Linux, comme vous l'indiquez dans votre deuxième paragraphe.


La réponse simple est que vous ne pouvez pas.

Les formats exécutables binaires PE (Windows) et ELF (Linux) sont totalement différents.

Sans oublier qu'un programme C/C++ nécessite une liaison vers des bibliothèques qui ne seront pas disponibles simultanément sur l'une ou l'autre plate-forme.

Cependant, vous pouvez utiliser Wine sur Linux pour exécuter l'exécutable Windows à condition qu'il ne tente pas d'appels exotiques spécifiques à Windows.

Ou vous pouvez choisir d'utiliser un langage multiplateforme plus "courant", tel qu'un langage CLI (C#/IronPython/Java, etc.) pris en charge par .NET pour Windows et Mono pour linux/autres.


Ok, les enfants.

Oui, vous POUVEZ écrire un binaire multi-plateforme, mais c'est difficile. C'est ce qu'on appelle un Fat Binary, et c'était assez courant dans les années 1980, bien que je ne l'aie pas vu depuis des décennies. https://en.wikipedia.org/wiki/Fat_binary

Fondamentalement, vous compilez le code machine pour chaque plate-forme sur laquelle vous souhaitez exécuter, puis liez manuellement le code avec différents points d'entrée. Alors que l'article de Wikipédia décrit simplement le regroupement de différentes architectures dans le même binaire, il est en fait possible de créer un binaire qui s'exécute sur différents systèmes d'exploitation tant que les points d'entrée des systèmes d'exploitation n'entrent pas en collision.

Certains formats exécutables ont été intentionnellement conçus pour permettre cela. Par exemple, MZ, NE, LX et PE peuvent être superposés. Les anciens programmes OS/2 le faisaient parfois... ils contenaient rarement un programme complet pour les deux systèmes d'exploitation, mais lorsqu'ils étaient exécutés sous DOS, un message s'affichait pour vous indiquer que vous utilisiez le mauvais système d'exploitation pour le programme.

En ce qui concerne Linux et Windows dans un seul binaire : Bien que vous ne puissiez pas faire un ELF et un PE, je pense que cela pourrait être faisable avec un PIE ou un COFF et un PE ou COM. Linux plus ancien exécutera les binaires COFF, dont PE est issu, il semble donc que vous pourriez être en mesure de créer un binaire universel if les nouvelles versions de Linux les exécuteront toujours. Je ne peux pas dire avec certitude que cela fonctionnerait, mais cela semble plausible.

Autre mise en garde :en général, vous devez insérer un saut dans le code dès le début pour ignorer le point d'entrée, les en-têtes, etc. de l'autre système d'exploitation, car vous ne pouvez pas y localiser votre code (évidemment).

Le problème avec cela dans l'informatique moderne est que la plupart des logiciels antivirus l'identifient à tort comme un virus. Il était courant que les virus attaquent les binaires en insérant un tel saut au début d'un exécutable qui sautait à la fin du binaire, en collant leur propre code à la fin du binaire, puis en insérant un autre saut vers l'exécutable principal code. Étant donné que vous devez faire quelque chose de plus ou moins similaire pour prendre en charge plusieurs plates-formes dans un seul binaire, la plupart des logiciels antivirus l'identifieront de manière heuristique comme un virus et mettront votre exécutable en quarantaine.

Donc en bref :OUI, cela peut être fait pour (certaines) combinaisons de plates-formes. Ce n'est pas impossible, mais il faudrait être fou pour le faire.


Linux
  1. Comment installer Wine et exécuter des applications Windows sous Linux

  2. Comment générer la somme de contrôle d'un fichier avec différentes fonctions de hachage SHA2 sous Linux et Windows

  3. Comment puis-je lier symboliquement un fichier sous Linux?

  4. Comment puis-je définir le DIRECTORY_SEPARATOR pour les plates-formes Windows et Linux ?

  5. Comment utiliser / (séparateur de répertoire) sous Linux et Windows en Python ?

Comment exécuter Windows 95 sous Linux

Comment compiler et exécuter des programmes C, C++ sous Linux

Comment exécuter des applications Linux sur Windows 10 et 11 à l'aide de WSL

Comment exécuter des programmes C/C++ sous Linux [Terminal &Eclipse]

Comment convertir un fichier .pem en un fichier .ppk sous Windows et Linux

Comment exécuter des applications d'interface graphique Linux sur Windows 10 avec WSL et WSLg