web-dev-qa-db-fra.com

getopt.h: Compiler le code C Linux sous Windows

J'essaie de compiler un ensemble de neuf fichiers * .c (et neuf fichiers * .h associés) sous Windows.

Le code a été initialement conçu sous Linux pour prendre les arguments de ligne de commande en utilisant la bibliothèque standard GNU-Linux/C "getopt.h". Et cette bibliothèque ne s'applique pas à la construction du code C dans Windows.

Je veux ignorer ce que mon code fait actuellement et poser la question suivante. Pour ceux d'entre vous qui connaissent bien cette bibliothèque C "getopt.h": sera-t-il possible de créer et d'exécuter mon code sous Windows s'il dépend d'arguments de ligne de commande de style POSIX? Ou devrais-je réécrire le code pour travailler sous Windows, en passant les fichiers d'entrée différemment (et en abandonnant la dépendance "getopt.h")?

24
theJollySin

Vous avez raison. getopt() est POSIX, pas Windows, vous devrez généralement réécrire tout le code d’analyse des arguments de la ligne de commande.

Heureusement, il existe un projet, Xgetopt, destiné aux classes Windows/MFC.

http://www.codeproject.com/Articles/1940/XGetopt-A-Unix-compatible-get -for-MFC-and-Win32

Si vous parvenez à ce que cela fonctionne dans votre projet, cela vous épargnera pas mal de codage et vous évitera d'avoir à retravailler toutes les analyses.

En outre, il est livré avec une application de démonstration compatible Nice GUI que vous devriez trouver utile.

Bonne chance!

19
DevNull

getopt() est en fait une fonction très simple. J'ai fait un github Gist pour cela, code à partir d'ici est en dessous aussi

#include <string.h>
#include <stdio.h>

int     opterr = 1,             /* if error message should be printed */
  optind = 1,             /* index into parent argv vector */
  optopt,                 /* character checked for validity */
  optreset;               /* reset getopt */
char    *optarg;                /* argument associated with option */

#define BADCH   (int)'?'
#define BADARG  (int)':'
#define EMSG    ""

/*
* getopt --
*      Parse argc/argv argument vector.
*/
int
  getopt(int nargc, char * const nargv[], const char *ostr)
{
  static char *place = EMSG;              /* option letter processing */
  const char *oli;                        /* option letter list index */

  if (optreset || !*place) {              /* update scanning pointer */
    optreset = 0;
    if (optind >= nargc || *(place = nargv[optind]) != '-') {
      place = EMSG;
      return (-1);
    }
    if (place[1] && *++place == '-') {      /* found "--" */
      ++optind;
      place = EMSG;
      return (-1);
    }
  }                                       /* option letter okay? */
  if ((optopt = (int)*place++) == (int)':' ||
    !(oli = strchr(ostr, optopt))) {
      /*
      * if the user didn't specify '-' as an option,
      * assume it means -1.
      */
      if (optopt == (int)'-')
        return (-1);
      if (!*place)
        ++optind;
      if (opterr && *ostr != ':')
        (void)printf("illegal option -- %c\n", optopt);
      return (BADCH);
  }
  if (*++oli != ':') {                    /* don't need argument */
    optarg = NULL;
    if (!*place)
      ++optind;
  }
  else {                                  /* need an argument */
    if (*place)                     /* no white space */
      optarg = place;
    else if (nargc <= ++optind) {   /* no arg */
      place = EMSG;
      if (*ostr == ':')
        return (BADARG);
      if (opterr)
        (void)printf("option requires an argument -- %c\n", optopt);
      return (BADCH);
    }
    else                            /* white space */
      optarg = nargv[optind];
    place = EMSG;
    ++optind;
  }
  return (optopt);                        /* dump back option letter */
}
34
bobobobo

Je (ai} _ compile le code getopt sous Windows. 

Je l'ai fait car je voulais explicilty utiliser ses fonctionnalités d'analyse en ligne de commande dans une application Windows (ligne de commande). 

J'ai réussi à utiliser ceci avec VC2010.

Autant que je m'en souvienne, je n'ai rencontré aucun problème important.

getopt.cgetoptl.c

5
alk

Il y a une possibilité d'utiliser le code de l'environnement d'exécution MinGW (par Todd C. Miller):

http://sourceforge.net/apps/trac/mingw-w64/browser/trunk/mingw-w64-crt/misc

J'ai créé une petite bibliothèque avec ces fichiers et le script CMake (pouvant générer un projet VS):

https://github.com/alex85k/wingetopt

3
akks

Vous pourriez essayer de regarder glib-2.0 comme alternative. Ce serait un peu gros pour avoir simplement besoin d'un analyseur d'options. Le bon côté serait d'avoir accès à tous les autres jouets merveilleux dans la glib. 

Pour être honnête, je n'ai pas essayé de faire en sorte que cela fonctionne (je m'en tiens principalement à Linux), donc YMMV. 

Faire fonctionner glib sous Windows: HowTo

Oh, vous pouvez explorer l'utilisation de mingw pour l'environnement de construction et de Visual Studio pour votre IDE. 

Glib pour Win32: HowTo

Anywho, espérons que cela aide.

1
rnordeen

si vous voulez juste utiliser getopt dans Visual C++ sans autres dépendances, j'ai le port getopt.c de la dernière version de GNU Libc 2.12, avec toutes les nouvelles fonctionnalités. commun dans les fenêtres.

il suffit de télécharger le code source, créer, copier libgetopt.lib et getopt.h getopt_int.h dans votre projet.

vous pouvez aussi le créer en utilisant CMakeList.txt dans le répertoire racine.

téléchargez le code source de github

1
bowman han

Le getopt.h existe dans git, je l'ai téléchargé et ça marche pour moi:

https://Gist.github.com/ashelly/7776712

0
Mahdi J.Ansari