40

9つの*.cファイル(および9つの関連する* .hファイル)のセットを取得して、Windowsでコンパイルしようとしています。

このコードは元々、標準のGNU-Linux/Cライブラリ「getopt.h」を使用してコマンドライン引数を取るようにLinuxで設計されました。そして、そのライブラリは、WindowsでのCコードの構築には適用されません。

私のコードが今何をしているのかを無視して、次の質問をしたいと思います。このCライブラリ「getopt.h」に精通している方へ:POSIXスタイルのコマンドライン引数に依存している場合、Windowsでコードをビルドして実行することは可能ですか?または、Windowsで機能するようにコードを書き直して、入力ファイルを別の方法で渡す(そして、「getopt.h」依存関係を捨てる)必要がありますか?

4

9 に答える 9

51

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 */
}
于 2013-06-19T15:46:40.897 に答える
26

あなたは正しいです。getopt()はPOSIXであり、Windowsではありません。通常、すべてのコマンドライン引数解析コードを書き直す必要があります。

幸い、Windows/MFCクラスを対象としたプロジェクトXgetoptがあります。

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

これをプロジェクトで機能させることができれば、コーディングをかなり節約でき、すべての解析をやり直す必要がなくなります。

さらに、便利なGUI対応のデモアプリが付属しています。

幸運を!

于 2012-05-01T21:20:16.310 に答える
7

MinGWランタイム(Todd C. Millerによる)のコードを使用する可能性があります。

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

これらのファイルとCMakeスクリプトを使用して小さなライブラリを作成しました(VSプロジェクトを生成できます)。

https://github.com/alex85k/wingetopt

于 2013-06-10T09:38:02.070 に答える
5

getoptウィンドウの下でコードをコンパイルしました。

これは、Windows(コマンドライン)アプリでコマンドライン解析機能を明示的に使用したかったためです。

を使用してこれを正常に実行しましたVC2010

私が覚えている限り、そうすることで重大な問題に遭遇することはありませんでした。

getopt.c getoptl.c

于 2012-05-01T21:34:14.940 に答える
2

getoptを他の依存関係なしにVisualC++で使用したいだけの場合は、最新のgnu libc 2.12からgetopt.cを移植し、すべての新機能を追加します。唯一の違いは、charの代わりにTCHARを使用する必要があることですが、これは非常に重要です。 Windowsで一般的です。

ソースをダウンロードし、作成し、libgetopt.libとgetopt.hgetopt_int.hをプロジェクトにコピーするだけです。

ルートディレクトリでCMakeList.txtを使用して作成することもできます。

githubからソースをダウンロードします

于 2014-09-09T08:33:51.780 に答える
1

別の方法としてglib-2.0を調べてみてください。オプションパーサーが必要なだけの場合は少し大きくなります。良い面は、glib内の他のすべての素晴らしいおもちゃにアクセスできることです。

正直なところ、私はこれを機能させることを試みていません(私は主にLinuxに固執しています)ので、YMMV。

glibをWindowsで機能させる:HowTo

ああ、ビルド環境にmingwを使用し、IDEにビジュアルスタジオを使用することを検討するかもしれません。

Win32用のGlib:ハウツー

誰でも、これが役立つことを願っています。

于 2014-01-15T19:49:30.583 に答える
1

ドキュメントを読んだところ、ヘッダーファイルgetopt.hは、Linux(およびHurd)で使用されるGNUCライブラリに固有のものです。getopt関数自体はPOSIXによって標準化されており、unistd.hのoptindoptargなどとともに宣言する必要があります。

Visual Studioでこれを試すことはできませんが、unistd.hが存在するかどうかを確認し、Visual Studioが他のPOSIX関数を提供するように、この関数を宣言することは価値があります。

If not, then I'd definitely grab an implementation of getopt rather than re-write the argument parsing to work without it. Getopt was written to make things easier for the programmer and more consistent for user of programs with command line arguments. Do check the license, though.

于 2020-04-27T12:18:53.817 に答える
0

私が覚えていることから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];
}
于 2012-05-01T21:22:17.367 に答える
0

getopt.hはgitに存在します、私はそれをダウンロードしました、そしてそれは私のために働きます:

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

于 2015-09-13T16:53:42.470 に答える