c - getopt_long - linux getopt
getopt.h: CompilaciĆ³n de C-Code de Linux en Windows (8)
Estoy tratando de obtener un conjunto de nueve * .c archivos (y nueve archivos relacionados * .h) para compilar en Windows.
El código se diseñó originalmente en Linux para tomar argumentos de línea de comando utilizando la biblioteca estándar de GNU-Linux / C "getopt.h". Y esa biblioteca no se aplica a la construcción del código C en Windows.
Quiero ignorar lo que hace mi código ahora mismo y hacer la siguiente pregunta. Para aquellos de ustedes que están familiarizados con esta biblioteca de C "getopt.h": ¿será posible construir y ejecutar mi código en Windows si depende de los argumentos de línea de comandos estilo POSIX? ¿O tendré que volver a escribir el código para trabajar para Windows, pasando los archivos de entrada de manera diferente (y abandonando la dependencia "getopt.h")?
El getopt.h existe en git, lo he descargado y funciona para mí:
Estás en lo correcto. getopt()
es POSIX, no Windows, por lo general, debería volver a escribir todo el código de análisis de argumentos de línea de comandos.
Afortunadamente, hay un proyecto, Xgetopt, destinado a las clases de Windows / MFC.
http://www.codeproject.com/Articles/1940/XGetopt-A-Unix-compatible-getopt-for-MFC-and-Win32
Si puede hacer que esto funcione en su proyecto, debería ahorrarle un poco de codificación y evitar que tenga que volver a procesar todo el análisis sintáctico.
Además, viene con una buena aplicación de demostración habilitada para GUI que debería ser útil.
¡Buena suerte!
Existe la posibilidad de usar código del tiempo de ejecución de MinGW (por Todd C. Miller):
http://sourceforge.net/apps/trac/mingw-w64/browser/trunk/mingw-w64-crt/misc
Creé una pequeña biblioteca con estos archivos y el script CMake (puede generar un proyecto VS):
Por lo que recuerdo de getopt.h
, todo lo que hace es proporcionar un analizador práctico para procesar argv desde tu función principal:
int main(int argc, char * argv[])
{
}
Los programas de la consola de Windows todavía tienen un método principal, por lo que simplemente puede recorrer su matriz argv y analizar los parámetros usted mismo. p.ej
for ( int i = 1; i < argc; i++ )
{
if (!strcmp(argv[i], "-f"))
filename = argv[++i];
}
Puede intentar buscar en glib-2.0 como alternativa. Sería un poco grande para solo necesitar un analizador de opciones. El lado positivo tendría acceso a todos los otros juguetes maravillosos en el glib.
Solo para ser sincero, no he intentado hacer que esto funcione (me quedo principalmente con Linux), entonces YMMV.
Hacer que glib funcione en Windows: HowTo
Ah, podrías explorar el uso de mingw para el entorno de compilación y Visual Studio para tu IDE.
Glib para Win32: HowTo
Anywho, espero que esto ayude.
si solo quieres que getopt se use en visual c ++ sin otras dependencias, tengo el puerto getopt.c de la última gnu libc 2.12, con todas las características nuevas. La única diferencia es que tienes que usar TCHAR en lugar de char, pero esto es muy común en windows.
simplemente descargue la fuente, haga, copie libgetopt.lib y getopt.h getopt_int.h en su proyecto.
también puede hacerlo usando CMakeList.txt en el directorio raíz.
getopt()
es en realidad una función realmente simple. Hice un github gist para él, el código de aquí está debajo también
#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 */
}
getopt
código getopt
en Windows.
Hice esto porque quería utilizar explícitamente su funcionalidad de análisis de línea de comandos en una aplicación de Windows (línea de comandos).
Lo hice con éxito usando VC2010
.
Por lo que recuerdo, no me encontré con problemas significativos al hacerlo.