ti-enxame.com

getopt.h: Compilando o código C do Linux no Windows

Eu estou tentando obter um conjunto de nove arquivos * .c (e nove relacionados *. H arquivos) para compilar no Windows.

O código foi originalmente projetado no Linux para pegar argumentos de linha de comando usando a biblioteca GNU-Linux/C padrão "getopt.h". E essa biblioteca não se aplica à criação do código C no Windows.

Eu quero ignorar o que meu código faz agora e fazer a seguinte pergunta. Para aqueles que estão familiarizados com esta biblioteca C "getopt.h": será possível construir e executar o meu código no Windows se depender de argumentos de linha de comando no estilo POSIX? Ou terei que reescrever o código para funcionar no Windows, passando os arquivos de entrada de forma diferente (e descartando a dependência de "getopt.h")?

24
theJollySin

Você está certo. getopt() é POSIX, não Windows, você geralmente teria que reescrever todo o código de análise de argumento de linha de comando.

Felizmente, existe um projeto, o Xgetopt, destinado a classes Windows/MFC.

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

Se você conseguir que isso funcione em seu projeto, ele deve economizar um bom número de códigos e impedir que você tenha que refazer toda a análise.

Além disso, ele vem com um aplicativo de demonstração habilitado para GUI que você deve achar útil.

Boa sorte!

19
DevNull

getopt() é na verdade uma função muito simples. Eu fiz um github Gist para isso, código daqui está abaixo também

#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

Eu fiz compilar o código getopt no windows. 

Eu fiz isso como queria explictyty usar sua funcionalidade de análise de linha de comando em um aplicativo do windows (linha de comando). 

Eu fiz isso com sucesso usando VC2010.

Tanto quanto me lembro, não tive problemas significativos ao fazê-lo.

getopt.cgetoptl.c

5
alk

Existe a possibilidade de usar o código do tempo de execução do MinGW (por Todd C. Miller):

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

Eu criei uma pequena biblioteca com esses arquivos e script CMake (pode gerar um projeto VS):

https://github.com/alex85k/wingetopt

3
akks

Você pode tentar olhar para o glib-2.0 como uma alternativa. Seria um pouco grande para apenas precisar de um analisador de opções. O lado positivo seria ter acesso a todos os outros brinquedos maravilhosos no glib. 

Só para ser honesto, eu não tentei fazer isso funcionar (eu prefiro principalmente ao Linux), então YMMV. 

Obtendo glib para trabalhar no windows: HowTo

Você pode explorar usando o mingw para o ambiente de criação e o visual studio para o seu IDE. 

Glib para Win32: HowTo

Anywho, espero que isso ajude.

1
rnordeen

se você quer apenas getopt para ser usado em visual c ++ sem outras dependências, eu tenho porta o getopt.c do mais recente gnu libc 2.12, com todos os novos recursos.A única diferença é que você tem que usar TCHAR em vez de char, mas isso é muito comum nas janelas.

basta baixar o código fonte, make, copiar libgetopt.lib e getopt.h getopt_int.h para o seu projeto.

você também pode fazer isso usando CMakeList.txt no diretório raiz.

faça o download do código fonte do github

1
bowman han

O getopt.h existe no git, eu baixei e funciona para mim:

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

0
Mahdi J.Ansari