UFO ET IT

getopt.h: Windows에서 리눅스 C-코드 컴파일

ufoet 2023. 6. 22. 23:16
반응형

getopt.h: Windows에서 리눅스 C-코드 컴파일

Windows에서 컴파일할 9개의 *.c 파일 세트(및 9개의 관련 *.h 파일)를 가져오려고 합니다.

이 코드는 원래 표준 GNU-리눅스/C 라이브러리 "getopt"를 사용하여 명령줄 인수를 취하도록 리눅스에서 설계되었습니다.h." 그리고 그 라이브러리는 Windows에서 C-code를 구축하는 데 적용되지 않습니다.

나는 지금 내 코드가 하는 일을 무시하고 다음과 같은 질문을 하고 싶습니다.이 C-라이브러리에 익숙한 사람들을 위해 "getopt".h": POSIX 스타일 명령줄 인수에 의존하는 경우 Windows에서 내 코드를 빌드하고 실행할 수 있습니까?또는 Windows에서 작동하도록 코드를 다시 작성하여 입력 파일을 다르게 전달하고 "getopt"를 버려야 합니까?h" 의존성)?

getopt()실제로는 매우 간단한 기능입니다.는 그것을 위해 githubstitus를 만들었고, 여기로부터의 코드도 아래에 있습니다.

#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()Windows가 아닌 POSIX이므로 일반적으로 모든 명령줄 인수 구문 분석 코드를 다시 작성해야 합니다.

다행히도 Windows/MFC 클래스를 위한 Xgetopt라는 프로젝트가 있습니다.

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

프로젝트에서 이 작업을 수행할 수 있다면 코딩 작업을 상당히 절약하고 모든 구문 분석을 다시 수행할 필요가 없습니다.

또한 유용한 GUI 지원 데모 앱이 함께 제공됩니다.

행운을 빕니다.

MinGW 런타임의 코드를 사용할 가능성이 있습니다(by Todd C).밀러):

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

다음 파일과 CMake 스크립트(VS 프로젝트 생성 가능)로 작은 라이브러리를 만들었습니다.

https://github.com/alex85k/wingetopt

는 그것을 컴파일했습니다.getopt비밀 암호

윈도우(명령줄) 앱에서 명령줄 구문 분석 기능을 사용하고 싶어서 이렇게 했습니다.

다음을 사용하여 성공적으로 수행했습니다.VC2010.

제 기억으로는 그렇게 하는 데 큰 문제가 없었습니다.

get opt.c get optl.c.

만약 당신이 다른 의존성 없이 시각적인 c++에서 사용되기를 원한다면, 나는 모든 새로운 기능을 갖춘 최신 gnu libc 2.12의 getopt.c 포트를 가지고 있습니다.유일한 차이점은 char 대신 TCAR을 사용해야 한다는 것입니다. 그러나 이것은 윈도우에서 매우 일반적입니다.

소스를 다운로드하고, 만들고, libgetopt.lib와 getopt.h를 프로젝트에 복사하기만 하면 됩니다.

CmakeList를 사용하여 만들 수도 있습니다.루트 dir의 txt.

github에서 소스 다운로드

당신은 대안으로 glib-2.0을 조사해 볼 수도 있습니다.옵션 파서가 필요한 것 치고는 좀 클 것 같습니다.긍정적인 면은 글립에 있는 다른 모든 멋진 장난감들에 접근할 수 있다는 것입니다.

솔직히 말해서, 저는 이것이 작동하도록 시도해 본 적이 없습니다(저는 주로 Linux에 집착합니다). 그래서 YMMV.

창에서 작업할 glib 가져오기:사용 방법

빌드 환경에서는 mingw를 사용하고 IDE에서는 visual studio를 사용하여 탐색할 수 있습니다.

Win32용 Glib: 사용 방법

누구든, 이게 도움이 되길 바랍니다.

설명서를 읽어보니 getopt.h 헤더 파일은 Linux(및 Hurd)와 함께 사용되는 GNU C 라이브러리에 고유합니다.getopt 함수 자체는 unistd.h의 optind optarg 등과 함께 선언되어야 한다고 말하는 POSIX에 의해 표준화되었습니다.

Visual Studio에서 직접 시도할 수는 없지만 unistd.h가 있는지 확인하고 Visual Studio가 다른 POSIX 기능을 제공하는 것처럼 이 기능을 선언하는 것이 좋습니다.

만약 그렇지 않다면, 나는 그것 없이도 작동하기 위해 인수 구문 분석을 다시 쓰는 것보다 확실히 getopt의 구현을 잡을 것입니다.Getopt는 프로그래머가 더 쉽고 명령행 인수가 있는 프로그램의 사용자가 더 일관성 있게 작업할 수 있도록 작성되었습니다.그래도 면허증을 확인해 보세요.

내가 기억하는 바로는getopt.h이 기능은 기본 기능에서 argv를 처리하기 위한 편리한 파서를 제공하는 것뿐입니다.

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

Windows 콘솔 프로그램에는 여전히 기본 방법이 있으므로 argv 배열을 반복하고 매개 변수를 직접 구문 분석할 수 있습니다.

for ( int i = 1; i < argc; i++ )
{
  if (!strcmp(argv[i], "-f"))
    filename = argv[++i];
}

getopt.h는 git에 존재하며, 나는 그것을 다운로드했고 그것은 나를 위해 작동합니다.

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

언급URL : https://stackoverflow.com/questions/10404448/getopt-h-compiling-linux-c-code-in-windows

반응형