簡體   English   中英

getopt.h:在 Windows 中編譯 Linux C 代碼

[英]getopt.h: Compiling Linux C-Code in Windows

我試圖在 Windows 下編譯一組九個 *.c 文件(和九個相關的 *.h 文件)。

該代碼最初在 Linux 中設計為使用標准 GNU-Linux/C 庫“getopt.h”獲取命令行參數。 該庫不適用於在 Windows 中構建 C 代碼。

我想忽略我的代碼現在所做的事情並提出以下問題。 對於那些熟悉這個 C 庫“getopt.h”的人:如果我的代碼依賴於 POSIX 風格的命令行參數,是否可以在 Windows 中構建和運行我的代碼? 或者我是否必須重新編寫代碼才能在 Windows 上工作,以不同的方式傳遞輸入文件(並放棄“getopt.h”依賴項)?

getopt()實際上是一個非常簡單的函數。 我為它制作了一個github 要點這里的代碼也在下面

#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()是 POSIX,而不是 Windows,您通常必須重新編寫所有命令行參數解析代碼。

幸運的是,有一個項目 Xgetopt 是為 Windows/MFC 類設計的。

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

如果您可以在您的項目中使用它,它應該可以為您節省大量編碼,並防止您必須返工所有解析。

此外,它還帶有一個很好的支持 GUI 的演示應用程序,您應該會發現它很有幫助。

祝你好運!

可以使用 MinGW 運行時的代碼(Todd C. Miller):

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

我用這些文件和 CMake 腳本創建了一個小庫(可以生成一個 VS 項目):

https://github.com/alex85k/wingetopt

確實在windows下編譯了getopt代碼。

我這樣做是因為我想在 Windows(命令行)應用程序中明確使用其命令行解析功能。

我使用VC2010成功地做到了這VC2010

據我所知,我這樣做沒有遇到任何重大問題。

getopt.c getoptl.c

如果你只想在沒有其他依賴的情況下在 Visual c++ 中使用 getopt,我從最新的 gnu libc 2.12 移植了 getopt.c,具有所有新功能。唯一的區別是你必須使用 TCHAR 而不是 char,但這是非常常見於windows。

只需下載源代碼,制作,將 libgetopt.lib 和 getopt.h getopt_int.h 復制到您的項目中。

你也可以在根目錄中使用 CMakeList.txt 來制作它。

從github下載源碼

您可以嘗試研究 glib-2.0 作為替代方案。 只需要一個選項解析器就有點大了。 好處是可以使用油嘴滑舌中的所有其他精彩玩具。

老實說,我還沒有嘗試讓它工作(我主要堅持使用 Linux),所以 YMMV。

讓 glib 在 Windows 中工作: HowTo

哦,您可以探索將 mingw 用於構建環境,並為您的 IDE 使用 Visual Studio。

Win32 的 Glib:操作方法

任何人,希望這會有所幫助。

根據我對文檔的閱讀,頭文件 getopt.h 特定於與 Linux(和 Hurd)一起使用的 GNU C 庫。 getopt 函數本身已經被 POSIX 標准化,它說它應該在 unistd.h 中與 optind optarg 等一起聲明

我自己無法在 Visual Studio 上嘗試此操作,但值得檢查 unistd.h 是否存在並聲明此函數,因為 Visual Studio 確實提供了一些其他 POSIX 函數。

如果沒有,那么我肯定會抓住 getopt 的實現,而不是重新編寫參數解析以在沒有它的情況下工作。 編寫 Getopt 的目的是使程序員的工作更輕松,並使具有命令行參數的程序用戶更一致。 不過,請檢查許可證。

getopt.h 存在於 git 中,我已經下載了它並且對我有用:

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

根據我對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];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM