- ベストアンサー
Cygwinに付属するg++コマンドについての質問
- Cygwinにはg++というC++コンパイルコマンドがありますが、なぜgccも存在するのでしょうか?
- g++で使用できるコマンドラインオプションとgccで使用できるコマンドラインオプションには違いがあるのでしょうか?
- g++でCソースファイルをビルドする際に表示される時間にはどんな意味があるのでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
すでに本筋からははずれてしまいましたが。 ○マニュアル 追加情報として、GNUのツールは、詳細なマニュアルをinfoで見れるようにしています。 info とだけ入力したり info gcc 等と指定することで読めます。 emacsのM-x info でも読めます。が、Windowネイティブ版をお使いのようなので、Cygwin関連のinfoは設定とかしないと読めません。Cygwinのemacsからだと、Cygwinのinfoが読めます。 -h --help オプション man コマンド info /usr/share/コマンドまたはパッケージ以下のドキュメント 大抵のことは、これくらい調べれば、なんらかのヒントは得られるはずです。 ○ gccでC++のコンパイル -lオプションとか、ライブラリやオブジェクトファイルの指定って、順番があるのご存知ですか? gcc -v test.cpp -lstdc++ だとうまくいきませんか? gcc -v -lstdc++ test.cpp gcc -v test.cpp -lstdc++ で -lstdc++の記述されてる場所が違うはずです。
その他の回答 (5)
- wormhole
- ベストアンサー率28% (1626/5665)
>まあ、g++でコンパイルできているので、g++を使えばいい話ですが、 >g++で出来ることはgccで出来るはずなのですよね? できます(断言) うちのFreeBSD9の環境でやるとこんな感じ。 % cat tst.cxx #include <iostream> int main(int argc, char **argv) { std::cout << "I have a pen." << std::endl; return 0; } % gcc -o tst tst.cxx /tmp//ccFNCha2.o: In function `std::__verify_grouping(char const*, unsigned long, std::string const&)': tst.cxx:(.text+0x2a): undefined reference to `std::string::size() const' tst.cxx:(.text+0x75): undefined reference to `std::string::operator[](unsigned long) const' tst.cxx:(.text+0xb4): undefined reference to `std::string::operator[](unsigned long) const' tst.cxx:(.text+0xfd): undefined reference to `std::string::operator[](unsigned long) const' /tmp//ccFNCha2.o: In function `main': tst.cxx:(.text+0x145): undefined reference to `std::cout' tst.cxx:(.text+0x14a): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' tst.cxx:(.text+0x152): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' tst.cxx:(.text+0x157): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))' /tmp//ccFNCha2.o: In function `__static_initialization_and_destruction_0(int, int)': tst.cxx:(.text+0x193): undefined reference to `std::ios_base::Init::Init()' /tmp//ccFNCha2.o: In function `__tcf_0': tst.cxx:(.text+0x1e2): undefined reference to `std::ios_base::Init::~Init()' /tmp//ccFNCha2.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0' % gcc -o tst tst.cxx -lstdc++ % ls tst tst %
お礼
wormholeさん、御回答ありがとうございます。 No5にあるように、 -lstdc++ の位置をかえると、僕の環境でもきちんとビルドできました。 何度も御回答ありがとうございました。
- kmee
- ベストアンサー率55% (1857/3366)
> 「No manual entry for g++」 gcc4-g++ パッケージに含まれているはずです。 man g++-4 でもだめですか? MANPATHが適切で無い、など、manが正しく機能してないかもしれません。 たしか以前MinGWを使っている、と書いてあったようですが、MinGWのbashからやってる、ってことは無いですね? >なるほど、C++ではオーバーロード関数という概念があるので、g++でtest.cをコンパイルするとエラーになるんでしょうね。 この例については「違います」。 オーバーロードの問題ではありません。プロトタイプ宣言での int func() ; と int func(void) ; との扱いの違いです。 > gccではなく、g++でしかコンパイルできないC++ソースファイルは、結構ありましたから ですから、「適切な引数」と書きました。 実際に gcc -v test.cpp g++ -v test.cpp の結果を比べてください。違うオプションが指定されているはずです。
お礼
御回答ありがとうございます。 >gcc4-g++ パッケージに含まれているはずです。 >man g++-4 >でもだめですか? >MANPATHが適切で無い、など、manが正しく機能してないかもしれません。 >たしか以前MinGWを使っている、と書いてあったようですが、MinGWのbashからやってる、ってことは無いですね? MANPATHが適切に設定されていませんでした。 設定後、 man gcc では文字化けしたので、 man gcc | nkf で何とか読めました。 >実際に >gcc -v test.cpp >g++ -v test.cpp >の結果を比べてください。違うオプションが指定されているはずです。 C++のソースファイルから実行ファイルを、gccとg++で、共に-vオプション付きでビルドしたところ、リンカであるcollect2のオプションで、g++の方にだけ「-lstdc++」があるという事が分かりました。 gccとg++の違いはここだけで、他は同じでしたが、 libstdc++.aがリンクされないために、最後のリンクで失敗しているようです。 そこで、 gcc -lstdc++ -v test.cpp のようにして、test.cppから実行ファイルをビルドしようとしましたが、結果は同じでした。 gccのヘルプを見ると、 リンカであるcollect2に「-lstdc++」を渡してコンパイルするには gcc -Wl,-lstdc++ test.cpp としたら良いみたいだったので、やった見たのですが、 /cygdrive/c/Users/Kei/AppData/Local/Temp/ccw3eI1y.o:test.cpp:(.text+0x5e1): undefined reference to `std::ios_base::Init::Init()' /cygdrive/c/Users/Kei/AppData/Local/Temp/ccw3eI1y.o:test.cpp:(.text+0x5fc): undefined reference to `std::ios_base::Init::~Init()' collect2: ld はステータス 1 で終了しました のようにエラーが出て、実行ファイルのビルドに失敗しました。 どうやらg++でないと、上手くいかないようです。
- wormhole
- ベストアンサー率28% (1626/5665)
>ソースファイルをビルドする時に、libgcc.aが、そのソースファイルから作成されたオブジェクトファイルとリンクされて、実行ファイルが作成されるという事でしょうか? >それとも、WindowsのDLLのように、実行ファイルが実際に走るときに、使われるのでしょうか? unixで一般的なライブラリファイル名の付け方なので ".a" で終わるライブラリファイルはどんなライブラリファイルなのか調べてみてください。 >cc1plus 0.03 0.01 >の0.03および0.01がそれぞれ、cc1plusが何をするのにかかった時間か? #2の方が既に書いてますけど、user timeとsystem timeです。 >>g++は適切な引数でgccを実行するためのもので、g++こそ不要と言えるかもしれません。 >そんなことはないのでは? >gccではなく、g++でしかコンパイルできないC++ソースファイルは、結構ありましたから。 それはgccに適切なオプションを指定してないから。
お礼
御回答ありがとうございます。 Unixのライブラリについては詳しく調べてみます。 また、-timeについては理解できました。 >>>g++は適切な引数でgccを実行するためのもので、g++こそ不要と言えるかもしれません。 >>そんなことはないのでは? >>gccではなく、g++でしかコンパイルできないC++ソースファイルは、結構ありましたから。 > >それはgccに適切なオプションを指定してないから。 No4のお礼の、後半に書いたようなことを試したのですが、gccでのコンパイルは上手くいきませんでした。 まあ、g++でコンパイルできているので、g++を使えばいい話ですが、 g++で出来ることはgccで出来るはずなのですよね?
- kmee
- ベストアンサー率55% (1857/3366)
せめて、マニュアルに書いてあること位は調べてから質問しましょうよ man gcc で読めます -timeについては-timeオプションの説明に書いてあります ※読んだ上で「system/user timeについて詳しく」ならまだしも C++専用オプションは、「C++ Language Options」に一覧があります CとC++は、一部仕様が異なります。g++でgccの代わりはできません。 例えば次のCのコードはC++ではエラーになります /* test.c */ int sub(); int main(){ return sub(0); } int sub(int a){ return a; } また、gccコマンドにはGNUコンパイラコレクション(GCC)の実行コマンドという面があります。 gcc test.cpp とすれば、C++としてコンパイルします。 ※リンク時に失敗するかもしれませんが むしろ、g++は適切な引数でgccを実行するためのもので、g++こそ不要と言えるかもしれません。 Cygwin特有の話としては、次の事情もあります ・GCCの共通のものは、gcc4-coreパッケージに入っている ・gccコマンドはgcc4-coreパッケージに入っている ・g++もGCCの一部なのでgcc4-coreが必要
お礼
>せめて、マニュアルに書いてあること位は調べてから質問しましょうよ >man gcc >で読めます >-timeについては-timeオプションの説明に書いてあります >※読んだ上で「system/user timeについて詳しく」ならまだしも >C++専用オプションは、「C++ Language Options」に一覧があります g++のマニュアルを見ようと、bash上で 「man g++」 としたのですが、 「No manual entry for g++」 と表示され、マニュアルを見ることができませんでしたので、今回のような質問をさせて頂きました。 gccについても同様です。 先ほどネット上で、gccの全てのオプションを網羅しているサイトを探し回った結果、やっと見つけたので、そちらを参考にさせて頂きます。 >CとC++は、一部仕様が異なります。g++でgccの代わりはできません。 >例えば次のCのコードはC++ではエラーになります・・・ なるほど、C++ではオーバーロード関数という概念があるので、g++でtest.cをコンパイルするとエラーになるんでしょうね。 理解しました。 >g++は適切な引数でgccを実行するためのもので、g++こそ不要と言えるかもしれません。 そんなことはないのでは? gccではなく、g++でしかコンパイルできないC++ソースファイルは、結構ありましたから。
- wormhole
- ベストアンサー率28% (1626/5665)
>・g++はC++だけでなく、Cのソースファイルもコンパイルできるので、Cのプログラムを開発するときは、gccは必要なく、g++だけでよいと思うのですが、どうしてgccが存在するのでしょうか? C++は元はCをベースにしてるとはいえ、細かい点で言語仕様が異なるところがあります(もちろんオブジェクト指向言語として拡張された分はCには存在しませんが)。 ですのでCのソースをCコンパイラでコンパイルするのと、C++コンパイラでコンパイルするのは全く同じではないです。 >・bashなどのコマンドライン上で libgcc.aについてはgccでコンパイルした実行ファイルで使用されるサブルーチンなどが納められているライブラリです。 >1つめの時間と、2つめの時間は、それぞれ何を意味するのでしょうか? 読んだそのまま。 cc1plus(C++のソースからアセンブラのソース(アセンブラソースでなくて中間コードだったかも)を生成するコマンド) as(アセンブラソースからオブジェクトファイルを生成するコマンド) それぞれがかかった時間です。 >・g++で使えるコマンドラインオプションとgccで使えるコマンドラインオプションは、 > 一緒のような気がするのですが、g++でしか使えないコマンドラインオプションってありますか? 調べてホームページで公開されている方もいらっしゃるので探してみてください。 gccやg++のマニュアル読めば解ることだけど。
お礼
wormholeさん、御回答ありがとうございます。 いつもお世話になっております。 >libgcc.aについてはgccでコンパイルした実行ファイルで使用されるサブルーチンなどが納められているライブラリです。 ソースファイルをビルドする時に、libgcc.aが、そのソースファイルから作成されたオブジェクトファイルとリンクされて、実行ファイルが作成されるという事でしょうか? それとも、WindowsのDLLのように、実行ファイルが実際に走るときに、使われるのでしょうか? >読んだそのまま。 >cc1plus(C++のソースからアセンブラのソース(アセンブラソースでなくて中間コードだったかも)を生成するコマンド) >as(アセンブラソースからオブジェクトファイルを生成するコマンド) >それぞれがかかった時間です。 申し訳ございません。 聞き方が悪かったです。 cc1plus 0.03 0.01 の0.03および0.01がそれぞれ、cc1plusが何をするのにかかった時間か? という事を聞きたかったのです。 よろしければ、引き続きよろしくお願い致します。
お礼
kmeeさん、何度も御回答ありがとうございます。 マニュアルについては、参考にさせて頂きます。 >-lオプションとか、ライブラリやオブジェクトファイルの指定って、順番があるのご存知ですか? それは知りませんでした。 確かに gcc -v test.cpp -lstdc++ で、実行ファイルをビルドすることができました。