Вопрос по visual-studio, c – getopt.h: Компиляция Linux C-кода в Windows

26

Я пытаюсь получить набор из девяти * .c файлов (и девять связанных * .h файлов) для компиляции под Windows.

Код изначально разрабатывался в Linux, чтобы принимать аргументы командной строки, используя стандартную библиотеку GNU-Linux / C «getopt.h». И эта библиотека не относится к созданию C-кода в Windows.

Я хочу игнорировать то, что мой код делает прямо сейчас, и задать следующий вопрос. Для тех из вас, кто знаком с этой C-библиотекой "getopt.h": возможно ли будет создать и запустить мой код в Windows, если это будет зависеть от аргументов командной строки в стиле POSIX? Или мне придется переписать код для работы в Windows, передавая входные файлы по-другому (и исключая зависимость "getopt.h")?

если поддержка MSVC не является жестким требованием, всегда есть MinGW: я вполне доволен пакетами кросс-компиляции MinGW, которые поставляются с Cygwin ... Christoph
Просто замечание по поводу комментариев alk, это можно сделать технически, но законность полностью зависит от совместимости лицензии (й) из источников getopt (если таковые имеются) и от проекта. Некоторые реализации getopt говорят, что общественное достояние, так что это, вероятно, не будет проблемой. user314159
getopt.h описывает API, предоставляемый методами изgetopt.c, Вытащите его откуда-нибудь, скомпилируйте и свяжите результат с вашим приложением и с вашим готовым. alk

Ваш Ответ

8   ответов
3

д С. Миллер):

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

Я создал небольшую библиотеку с этими файлами и сценарием CMake (может генерировать проект VS):

https://github.com/alex85k/wingetopt

Похоже, ваша библиотека была бы очень полезна. Я только хотел сказать. Но я сначала увидел комментарий Догберта о Xgetopt, и это сработало. Спасибо хоть! theJollySin
1

чтобы getopt использовался в Visual C ++ без других зависимостей, я перенесу getopt.c из последней версии GNU libc 2.12 со всеми новыми функциями. Единственное отличие состоит в том, что вы должны использовать TCHAR вместо char, но это очень общий в окнах.

просто скачайте исходный код, сделайте, скопируйте libgetopt.lib и getopt.h getopt_int.h в ваш проект.

Вы также можете сделать это, используя CMakeList.txt в корневом каталоге.

скачать исходник с github

21

getopt() это POSIX, а не Windows, вам, как правило, придется переписывать весь код синтаксического анализа аргументов командной строки.

К счастью, есть проект Xgetopt, предназначенный для классов Windows / MFC.

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

Если вы можете заставить это работать в вашем проекте, это должно сэкономить вам немного кода и избавить вас от необходимости переделывать весь анализ.

Кроме того, он поставляется с хорошим демонстрационным приложением с графическим интерфейсом, которое вам может пригодиться.

Удачи!

Я решил пометить ваш ответ как правильный, но здесь была одна деталь, которая вообще не использовала Visual Studio. Оказывается, Visual Studio допускает только стандарты C89, и они не планируют поддерживать стандарты C99. Это делает Visual Studio совершенно бесполезной для наших целей. Спасибо за вашу помощь, хотя! theJollySin
Не могли бы вы назвать причину переписать, но делать упражнения для разбора?
Глупо, что они долгое время игнорировали запросы на поддержку C99.
Да, я все равно считаю V $ мусором. Eclipse делает ту же работу бесплатно и поддерживает последние стандарты. VIM + GCC еще лучше, но требует тщательного изучения.
Я попробую прямо сейчас. Но я не могу сказать по ссылке, которую вы показали: API для этой библиотеки такой же, как старый API Getopt? theJollySin
35

getopt() на самом деле действительно простая функция. я сделалGithub Gist для этого кодотсюда ниже тоже

#include <string..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 */
}
Файл заголовка отсутствуетextern char *optarg; а такжеextern int optind, opterr, optopt;
Я включил это в свой проект, однако, когда я пытаюсь использовать optarg, он говорит, что он не объявлен в Windows. Возвращаемое значение getopt всегда opt. Как я могу использовать Optarg?
1

то было бы немного большим для просто необходимости анализатора опций. У верхней стороны будет доступ ко всем другим замечательным игрушкам в игре.

Честно говоря, я не пытался заставить это работать (я в основном придерживаюсь Linux), так что YMMV.

Начало работы в Windows:Как

О, вы могли бы изучить использование mingw для среды сборки и Visual Studio для вашей IDE.

Glib для Win32:Как

Надеюсь, это поможет.

-1

Из того, что я помнюgetopt.hвсе, что он делает - это предоставляет удобный парсер для обработки argv из вашей основной функции:

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

В консольных программах Windows по-прежнему есть метод main, поэтому вы можете просто пройтись по массиву argv и проанализировать параметры самостоятельно. например

for ( int i = 1; i < argc; i++ )
{
  if (!strcmp(argv[i], "-f"))
    filename = argv[++i];
}
Звучит так, как будто вам нужно собраться с этими другими разработчиками и согласовать переносимую систему аргументов. Решение, предоставленное @theJollySin, вполне может быть ответом, но в любом случае нетрудно написать портативный анализатор аргументов.
Со временемgetopt API выглядел довольно стабильно для меня. @theJollySin
Спасибо! Я не уверен, будет ли это практичным для меня. Хотя я понимаю, что могу пролистать ~ 5000 строк кода и переписать эти биты, это код, который мы получаем от других разработчиков. Итак, что происходит через 2 месяца, когда нам дают немного более новую версию кода? Должен ли я переделывать код обработки аргументов каждый раз, когда мы получаем обновление? Это звучит много времени. theJollySin
Зачем делать это вручную, когдаgetopt функция доступна в интернете?
0
Ну, поиск getopt.h не был моей проблемой. Меня больше беспокоило, что Windows getopt.h работает в среде Linux. Хорошо знать, хотя. theJollySin
5

did скомпилироватьgetopt код под windows.

Я сделал это так, как хотелexplicilty использовать его функцию синтаксического анализа командной строки в приложении Windows (командной строки).

Я успешно сделал это с помощьюVC2010.

Насколько помню, не столкнулс с какими-либо существенными проблемами при этом.

getopt.c getoptl.c

Похожие вопросы