getopt.H: compilation de code C Linux sous Windows

J'essaie d'obtenir un ensemble de neuf *.c fichiers (et neuf connexes *.h fichiers) à compiler sous Windows.

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

Je veux ignorer ce que fait mon code en ce moment et poser la question suivante. Pour ceux d'entre vous familiers avec cette bibliothèque C " getopt.h": il sera possible de créer et d'exécuter mon code dans Windows si cela dépend des arguments de ligne de commande de style POSIX? Ou vais-je devoir réécrire le code pour fonctionner pour Windows, en passant des fichiers d'entrée différemment (et en amerrissant le " getopt.h" dépendance)?

24
demandé sur theJollySin 2012-05-02 01:12:58

8 réponses

Vous avez raison. {[0] } est POSIX, pas Windows, vous devrez généralement réécrire tout le code d'analyse des arguments de ligne de commande.

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

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

Si vous pouvez faire fonctionner cela dans votre projet, cela devrait vous faire économiser un peu de codage et vous empêcher d'avoir à tout retravailler parsing.

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

Bonne chance!

19
répondu DevNull 2012-12-18 22:53:06

getopt() est en fait une fonction très simple. J'ai fait un GitHub gist pour cela, le code d'ici est ci-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 */
}
33
répondu bobobobo 2014-07-29 08:29:12

J'aifait compiler le code getopt sous windows.

Je l'ai fait comme je voulais explicilty utiliser sa fonctionnalité d'analyse de ligne de commande dans une application windows (ligne de commande).

Je l'ai fait avec succès en utilisant VC2010.

Pour autant que je me souvienne, je n'ai rencontré aucun problème important.

Getopt.c getoptl.c

5
répondu alk 2017-12-11 22:13:33

Il est possible d'utiliser le code de mingw runtime (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 (peut générer un projet VS):

Https://github.com/alex85k/wingetopt

3
répondu akks 2013-06-10 09:38:02

Vous pouvez essayer de regarder dans glib-2.0 comme alternative. Ce serait un peu grand pour avoir juste besoin d'un analyseur d'options. Le côté supérieur aurait accès à tous les autres jouets merveilleux dans le glib.

Juste pour être honnête, je n'ai pas essayé de faire fonctionner cela (je m'en tiens surtout à Linux), donc YMMV.

Faire fonctionner glib sous windows: HowTo

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

Glib pour Win32: HowTo

Anywho, j'espère que cela aide.

1
répondu rnordeen 2014-01-15 19:49:30

Si vous voulez juste que getopt soit utilisé dans visual C++ sans autres dépendances, j'ai le port getopt.c de la dernière gnu libc 2.12, avec toutes les nouvelles fonctionnalités.La seule différence est que vous devez utiliser TCHAR au lieu de char, mais cela est très commun dans windows.

Il suffit de télécharger la source, faire, copier libgetopt.lib et getopt.h getopt_int.h à votre projet.

Vous pouvez également le faire en utilisant CMakeList.txt dans le répertoire racine.

Télécharger de la source de github

1
répondu bowman han 2014-09-09 09:06:33

Le getopt.h existe dans git, Je l'ai téléchargé et cela fonctionne pour moi:

Https://gist.github.com/ashelly/7776712

0
répondu Mahdi J.Ansari 2015-09-13 16:53:42

D'après ce que je me souviens de getopt.h, Tout ce qu'il fait est de fournir un analyseur pratique pour traiter argv à partir de votre fonction principale:

int main(int argc, char * argv[])
{
}

Les programmes de la console Windows ont toujours une méthode principale, vous pouvez donc simplement parcourir votre tableau argv et analyser les paramètres vous-même. par exemple

for ( int i = 1; i < argc; i++ )
{
  if (!strcmp(argv[i], "-f"))
    filename = argv[++i];
}
-1
répondu Benj 2012-05-01 21:22:17