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")?
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!
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 */
}
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.
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):
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.
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.
Le getopt.h existe dans git, je l'ai téléchargé et ça marche pour moi: