Utilisation de fork () avec VS 2013 et Cygwin

J’essaie d’écrire un programme C qui utilisera fork () et wait () dans Visual Studio 2013. J’ai téléchargé et installé Cygwin, mais je ne peux pas configurer Visual Studio pour utiliser les fichiers d’en-tête appropriés. Je suis assez nouveau à l’IDE et je me demandais si cette communauté pourrait m’aider à comprendre où je fais une erreur.

Lorsque je commence un nouveau projet, voici ce que je fais:

  1. Créer une nouvelle application console Visual C ++ Win32
  2. Ajouter un nouveau fichier source main.c au projet
  3. Cliquez avec le bouton droit sur les propriétés du projet et configurez les répertoires d’inclusion pour inclure le répertoire Cygwin: C: \ cygwin64

J’ai pris une capture d’écran de l’emplacement où j’essaie de configurer les propriétés au cas où je commettais une erreur: entrez la description de l'image ici

Mon code est plutôt simple car j’essaie simplement de le faire fonctionner à ce stade:

#include  int main() { int i; i = fork(); if (i == 0) { printf("I am the child."); } else { wait(&i); } } 

Voici une capture d’écran du message d’erreur que je reçois lorsque j’essaie de générer mon projet: entrez la description de l'image ici

Je m’excuse d’avance s’il s’agit d’une question idiote, mais j’apprécie toute aide que vous pouvez offrir. S’il y a quelque chose que je peux faire de mon côté pour aider à résoudre les problèmes, veuillez me le faire savoir.

Le problème est que votre chemin d’inclusion actuel C:\cygwin64\bin est équivalent à unix /bin , qui est destiné aux fichiers binarys (également appelés exécutables). Pour utiliser les en-têtes unix, vous devez utiliser l’équivalent de /usr/include , qui, pour votre système, doit être C:\cygwin64\usr\include .

L’utilisation de fork () dans une application de console Win32 ne va pas fonctionner. C’est un appel système Unix. Cygwin est une émulation de l’environnement Linux qui s’exécute sur Win32.

Comme d’autres l’ont déjà dit, vous devez utiliser la chaîne d’outils Cygwin pour comstackr et construire.

Il se peut que des bibliothèques tierces permettent à Visual Studio d’effectuer une compilation croisée pour Cygwin, mais une application console Win32 n’est certainement pas ce que vous voulez si vous passez des appels système Unix.

Ok, il y a beaucoup d’éléments ici pour faire cela, et il y a aussi beaucoup de réponses ici avec des informations incorrectes.

Tout d’abord, comme certains l’ont dit, vous devez modifier votre chemin d’inclusion pour qu’il contienne votre dossier d’inclusion de Cygwin, qui semble être C:\Cygwin64\usr\include .

Ensuite, il y a une FAQ sur ce sujet sur le site Cygwin. Comment utiliser cygwin1.dll avec Visual Studio ou MinGW?

De la page:

Utilisez le programme impdef pour générer un fichier .def pour le fichier cygwin1.dll (si vous générez la dll cygwin à partir du fichier source, vous aurez déjà un fichier def.)

impdef cygwin1.dll > cygwin1.def

Utilisez l’éditeur de liens MS VS (lib) pour générer une bibliothèque d’importation

lib /def=cygwin1.def /out=cygwin1.lib

Créez un fichier “my_crt0.c” avec le contenu suivant

 #include  #include  typedef int (*MainFunc) (int argc, char *argv[], char **env); void my_crt0 (MainFunc f) { cygwin_crt0(f); } 

Utilisez gcc dans une invite Cygwin pour créer my_crt0.c dans une DLL (par exemple, my_crt0.dll). Suivez les étapes 1 et 2 pour générer des fichiers .def et .lib pour la DLL.

Téléchargez crt0.c à partir du site Web cygwin et intégrez-le dans vos sources. Modifiez-le pour appeler my_crt0 () au lieu de cygwin_crt0 ().

Construisez vos fichiers object en utilisant le compilateur MS VC cl.

Liez vos fichiers object, cygwin1.lib et my_crt0.lib (ou ce que vous avez appelé) à l’exécutable.

Notez que si vous utilisez d’autres bibliothèques basées sur Cygwin, vous aurez probablement besoin de les construire en tant que DLL à l’aide de gcc, puis de générer des bibliothèques d’importation pour l’éditeur de liens MS VC.