2012-05-01 25 views
24

Windowsでコンパイルするために9つの* .cファイル(9つの関連する* .hファイル)を取得しようとしています。getopt.h:WindowsでLinuxのCコードをコンパイルする

このコードはもともとLinuxで標準のGNU-Linux/Cライブラリ "getopt.h"を使ってコマンドライン引数を取るように設計されていました。また、このライブラリは、WindowsでCコードを作成する場合には適用されません。

私のコードが今行っていることを無視して、次の質問をします。このCライブラリ "getopt.h"に精通している人は、POSIXスタイルのコマンドライン引数に依存する場合、Windowsで自分のコードをビルドして実行することは可能でしょうか?または、入力ファイルを別々に渡して(そして "getopt.h"の依存関係を避ける)、Windowsで動作するようにコードを書き直さなければなりませんか?

+2

MSVCサポートが難しい要件でない場合は、MinGWのは常にあります:私は」 Cygwinに付属のMinGWクロスコンパイラパッケージにはかなり満足しています。 – Christoph

+2

'getopt.h'は、' getopt.c'からメソッドによって提供されたAPIを扱っています。それをどこかから引っ張ってコンパイルし、結果をあなたのアプリにリンクしてください。 – alk

+1

これは技術的には可能ですが、合法性は、getoptソース(存在する場合)とプロジェクトのものとの互換性に完全に依存します。いくつかのgetopt実装はパブリックドメインと言います。そうすれば問題はないでしょう。 – user314159

答えて

19

あなたは正しいですか? getopt()はWindowsではなくPOSIXですから、一般的にはすべてのコマンドライン引数の解析コードを書き直さなければなりません。

幸いなことに、Windows/MFCクラス用のプロジェクトXgetoptがあります。

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

プロジェクトでこの作業を取得することができた場合、それはあなたのコードの公平なビットを保存し、すべての解析を手直しすることからあなたを防ぐ必要があります。

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

幸運を祈る!

+0

私は今試してみましょう。しかし、あなたが示したリンクからはわかりません:このライブラリのAPIは古いgetopt APIと同じですか? – theJollySin

+0

書き直しを行う理由は何ですか? – alk

+0

移植する必要があるコードの日付は? @theJollySin – alk

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]; 
} 
+0

ありがとう! これが私にとって実用的かどうかは分かりません。私は〜5000行のコードをスクロールしてこれらのビットを書き直すことができると理解していますが、これは他の開発者から得ているコードです。 2か月後に少しだけ新しいバージョンのコードが提供されたらどうなりますか?私たちが更新を得るたびに引数の処理コードをやり直さなければならないのでしょうか?それは時間がかかりますね。 – theJollySin

+0

あなたはこれらの他の開発者と一緒になり、移植可能な引数渡しシステムに同意する必要があるように聞こえます。 @theJollySinによって提供される解決策が答えになるかもしれませんが、移植可能な引数パーサーを書くのは難しくありません。 – Benj

+2

'getopt' APIは静かに安定していました。 @theJollySin – alk

5

私はは窓の下getoptコードをコンパイルしました。

私はこのようにしました。expliciltyは、コマンドライン解析機能をWindows(コマンドライン)アプリケーションで使用しています。

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

私が覚えている限り、重大な問題は発生していませんでした。

getopt.cgetoptl.c

+2

提案された編集は、「この特定のコードはLGPLではなく、GPLv3でカバーされていることに注意してください。私はそれをロールバックし、コメントをここに含めます。 –

+0

Er、 'getopt.in.h'を含む? –

+0

@VictorSergienko: 'getopt'のソースをコンパイルするためには、' getopt.in.h'の中のいくつかのコードが必要でした。とにかく、私の答えは、リンクされたファイルをコンパイルすることは、(マイナーな)変更をせずに可能であったという理解のためのものではありませんでした。 VC10に「そのまま」供給するだけでは機能しません。 – alk

3

(トッドC. Miller氏による)MinGWのランタイムからコードを使用するpossibiltyがあります:

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

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

https://github.com/alex85k/wingetopt

+0

あなたの図書館が本当に役に立つと思われるようです。私はちょうど言ったかった。しかし、まずXgetoptについてのDogbertのコメントを見て、そのトリックをしました。ありがとう、しかし! – theJollySin

32

getopt()は実際には本当に単純な関数です。私はそれのためにgithub gistを作った、コードfrom hereあなたは代替としてのglib-2.0に探してみてください、あまりにも以下

#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 */ 
} 
+2

これは私のプロジェクトに含まれていますが、optargを使用しようとすると、Windowsでは宣言されていません。 getoptの戻り値は常にoptです。 optargはどのように使用できますか? – eleijonmarck

+2

ヘッダーファイルに 'extern char * optarg;'と 'extern int optind、opterr、optopt;がありません。 – cubrr

1

です。オプションパーサーを必要とするだけのためには少し大きいでしょう。上の側は、glibの他のすてきなおもちゃにアクセスできます。

正直言って、私はこれを動作させることを試みていません(私は主にLinuxに固執しています)ので、YMMVです。

ウィンドウで動作するようにglibの行き方:HowTo

ああ、あなたはビルド環境のためにmingwのを使用して探索し、あなたのIDEのVisual Studioかもしれません。 Win32用

口が達者な:HowTo

とにかくは、このことができます願っています。

1

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

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

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

download the source from github

0

getopt.hはgitの中に存在する、私はそれをダウンロードしてもらい、それが私の作品:

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

+0

まあ、getopt.hを見つけることは私の問題ではありませんでした。私はLinux環境で動作するWindowsのgetopt.hについてより心配していました。しかし、よく知っている。 – theJollySin

関連する問題