Cygwinに付属するg++コマンドについての質問

このQ&Aのポイント
  • Cygwinにはg++というC++コンパイルコマンドがありますが、なぜgccも存在するのでしょうか?
  • g++で使用できるコマンドラインオプションとgccで使用できるコマンドラインオプションには違いがあるのでしょうか?
  • g++でCソースファイルをビルドする際に表示される時間にはどんな意味があるのでしょうか?
回答を見る
  • ベストアンサー

Cygwinに付属しているg++コマンドについて

こんにちは。 Cygwinに付属しているC++コンパイルコマンドのg++について、いくつか質問させて下さい。 ・g++はC++だけでなく、Cのソースファイルもコンパイルできるので、Cのプログラムを開発するときは、gccは必要なく、g++だけでよいと思うのですが、どうしてgccが存在するのでしょうか? g++だけで十分ですよね? ・bashなどのコマンドライン上で g++ -print-libgcc-file-name と入力すると、コンパイラのコンパニオンライブラリ名を表示されるようなのですが、 コンパイラライブラリって何なのでしょうか? ちなみに自分の環境では、 /bin/../lib/gcc/i686-pc-cygwin/4.3.4/libgcc.a と表示されました。 ・-timeオプションを付けてg++でCソースファイルをビルドすると、以下のようになりました。 $ g++ -time "test.c" # cc1plus 0.03 0.01 # as 0.00 0.01 # collect2 0.00 0.08 1つめの時間と、2つめの時間は、それぞれ何を意味するのでしょうか? ・g++で使えるコマンドラインオプションとgccで使えるコマンドラインオプションは、 一緒のような気がするのですが、g++でしか使えないコマンドラインオプションってありますか? 以上です。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

すでに本筋からははずれてしまいましたが。 ○マニュアル 追加情報として、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++の記述されてる場所が違うはずです。

MetalLover
質問者

お礼

kmeeさん、何度も御回答ありがとうございます。 マニュアルについては、参考にさせて頂きます。 >-lオプションとか、ライブラリやオブジェクトファイルの指定って、順番があるのご存知ですか? それは知りませんでした。 確かに gcc -v test.cpp -lstdc++ で、実行ファイルをビルドすることができました。

その他の回答 (5)

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.6

>まあ、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 %

MetalLover
質問者

お礼

wormholeさん、御回答ありがとうございます。 No5にあるように、 -lstdc++ の位置をかえると、僕の環境でもきちんとビルドできました。 何度も御回答ありがとうございました。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

> 「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 の結果を比べてください。違うオプションが指定されているはずです。

MetalLover
質問者

お礼

御回答ありがとうございます。 >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% (1619/5653)
回答No.3

>ソースファイルをビルドする時に、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に適切なオプションを指定してないから。

MetalLover
質問者

お礼

御回答ありがとうございます。 Unixのライブラリについては詳しく調べてみます。 また、-timeについては理解できました。 >>>g++は適切な引数でgccを実行するためのもので、g++こそ不要と言えるかもしれません。 >>そんなことはないのでは? >>gccではなく、g++でしかコンパイルできないC++ソースファイルは、結構ありましたから。 > >それはgccに適切なオプションを指定してないから。 No4のお礼の、後半に書いたようなことを試したのですが、gccでのコンパイルは上手くいきませんでした。 まあ、g++でコンパイルできているので、g++を使えばいい話ですが、 g++で出来ることはgccで出来るはずなのですよね?

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

せめて、マニュアルに書いてあること位は調べてから質問しましょうよ 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が必要

MetalLover
質問者

お礼

>せめて、マニュアルに書いてあること位は調べてから質問しましょうよ >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% (1619/5653)
回答No.1

>・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++のマニュアル読めば解ることだけど。

MetalLover
質問者

お礼

wormholeさん、御回答ありがとうございます。 いつもお世話になっております。 >libgcc.aについてはgccでコンパイルした実行ファイルで使用されるサブルーチンなどが納められているライブラリです。 ソースファイルをビルドする時に、libgcc.aが、そのソースファイルから作成されたオブジェクトファイルとリンクされて、実行ファイルが作成されるという事でしょうか? それとも、WindowsのDLLのように、実行ファイルが実際に走るときに、使われるのでしょうか? >読んだそのまま。 >cc1plus(C++のソースからアセンブラのソース(アセンブラソースでなくて中間コードだったかも)を生成するコマンド) >as(アセンブラソースからオブジェクトファイルを生成するコマンド) >それぞれがかかった時間です。 申し訳ございません。 聞き方が悪かったです。 cc1plus 0.03 0.01 の0.03および0.01がそれぞれ、cc1plusが何をするのにかかった時間か? という事を聞きたかったのです。 よろしければ、引き続きよろしくお願い致します。

関連するQ&A

  • cygwinでのフャイルやり取り

    学校でcygwinを使ってるんですが、分からないことが多すぎて勉強に追いつけません。C言語は出来るのですが、cygwinの操作に慣れなくて苦戦しています。 そこで質問なんですが、cygwin(vi)でプログラム(C/C++)を作るのがめんどくさいので、先ず最初にwindowsのメモ帳を使ってプログラムを書いた後、cygwin(gcc)でコンパイラさせたいんでけど、テキストファイルが何処にも見当たりません。 というかコマンドラインでのファイル操作が出来ません。 どうやったらwindowsとcygwinでのフャイルのやり取りが出来るのでしょうか? もし誰か知っていたら教えてください お願いします

  • windowsとcygwinのフャイル共用について

    学校でcygwinを使ってるんですが、分からないことが多すぎて勉強に追いつけません。C言語は出来るのですが、cygwinの操作に慣れなくて苦戦しています。 そこで質問なんですが、cygwin(vi)でプログラム(C/C++)を作るのがめんどくさいので、先ず最初にwindowsのメモ帳を使ってプログラムを書いた後、cygwin(gcc)でコンパイラさせたいんでけど、テキストファイルが何処にも見当たりません。 というかコマンドラインでのファイル操作が出来ません。 どうやったらwindowsとcygwinでのフャイルのやり取りが出来るのでしょうか? もし誰か知っていたら教えてください お願いします

  • cygwin プログラミング コンパイラ

    c言語のプログラミングの練習のためにcygwinというものをwindows vistaにダウンロードしたのですが、gcc fib.cみたいにコンパイルしたらbash:gcc:command not foundとでてきます。 コンパイラはcygwinと別にダウンロードしないといけないのですが。 エディタとしてメモ帳をつかってるのですが おしえてください

  • CygwinからVisual C++へ

    Cygwinでコンパイルしていたプログラムを、 Visual C++の cl コマンドでコンパイルしたいです。 あるプログラムを書きまして、Cygwinをインストールし、 [block.rc] BLOCKS BITMAP "block.bmp" という内容のリソースファイルを作成して、 windres block.rc -o block.o gcc -mwindows aaa.cpp block.o でちゃんとコンパイルできていました。 上記のように Visual Studio 2010 のVisual C++でコンパイルするにはどうしたらいいのかわかりません。 cl aaa.cpp block.o とやっても cl -mwindows aaa.cpp block.o とやっても、コンパイルできませんでした。 -mwindowsに代わるclコマンドのオプションを探してはみてみたものの、 -GA windowsアプリケーション用の最適化を行う というものを見つけたのでやってみましたがだめでした。 どなたか、コンパイルのアドバイスを下さい。

  • CygwinにインストールされたGCCを2.95にしたい

    Cygwin上でATLASというソースをコンパイルしようとしたところ、なんどもエラーがでて、止まってしまいます。 調べたところ、GCCのバージョンを2.95にする、という対処法がありました。 ですが、そのインストール法について調べても、よくわかりません。 昔はcygwinのsetup中にgcc-2という項目があったようなのですが、いまでは見つかりませんので、cygwin上でgcc3.*をアンインストールして、2.*をインストールするしかないのでしょうか? また、そうだとすれば、どうやればいいのでしょうか? cygwin上でgcc2を使う方法をどうか教えてください。

  • C++プログラムにおけるexeファイルサイズ

     borland C++でプログラムを記述し、コンパイルするとexeファイルサイズがソースのそれの約100倍に増えます。  これを低減する方法を教示ください?  gcc、g++、vccなど各種コンパイラによって異なるそうですが。

  • Cygwinでコンパイルできません。

    CygwinをすべてDefaultでインストールしました。 テキストエディタとしてTeraPadを利用しています。 テラパッドでtest.cというファイルをつくり、 gcc -o test test.c でコンパイルしたのですが gcc:test.c:No such file or directory gcc:no input files と表示されます。 正常にコンパイルするにはどうしたらいいのでしょうか? 自分はC言語について勉強したばかりでくわしくないので、この質問を書いていて言葉足らずなところがあり説明不十分かもしれませんが、よろしくお願いします。

  • Cygwinで使用しているgccをダウングレードしたい

    Cygwinで使用しているgccをダウングレードしたい Cygwinをインストールして、gccコンパイラを使ったプログラミングをしています。 現在使用しているgccのバージョンは3.4.4です。 これからコンパイルしたいプロジェクトが、 動作保障としてgcc 3.0.2 または 3.3とされており、 当方のgccもダウングレードして使用したいと思っています。 gccのダウングレード方法を調べたのですが gccのサイト(http://gcc.gnu.org/)で、どこからダウンロードすればよいかわかりませんでした。 また、Cygwin上でどのように設定すれば良いかわかりません。 ご存知の方教えてください。 よろしくお願いします。

  • Cygwinのエディタについて

    Cygwinのエディタのviで、c言語のプログラムを作成し、gccでコンパイルすると、a.exeというファイルができます。私は今まで、Linuxのviでc言語のプログラムを実行するときは、a.outを使っていました。 Cygwinのviでもa.outを使うにはどう設定すればよいのでしょうか?

  • cygwinで-mno-cygwinオプションの有無によって動作の変わる原因について

    こんにちは、shigre2005と申します。 私は普段UNIX上でC言語のプログラムを書いているのですが、わけあってWindows上で動くようにする必要が出てきました。そのプログラムをそのままcygwinでコンパイルしたところコンパイルでき、実行ファイルも問題なく実行できたのですが、このままですとcygwin1.dllが必要になってしまいます。 上記のような質問を前回した際に、gccに-mno-cygwinオプションをつければよいと教えていただき、そのときはうまく行ったのですが、今回はなぜかうまく行きません。オプションをつけないときは普通に実行できるのですが、つけると、リンクの段階で以下のようなエラーが出てしまいます。 /usr/lib/gcc-lib/i686-pc-mingw32/3.3.3/../../../../i686-pc-mingw32/bin/ld: crtbe gin.o: No such file: No such file or directory make: *** [all] Error 1 makefileを使っていて、GTKを使用しています。-mno-cygwin以外のコンパイルオプションは以下のものをつけています。 (.c→.o) -Wall -DGTK_DISABLE_DEPRECATED -mms-bitfields `/usr/bin/pkg-config --cflags gtk+-win32-2.0` (.o→.exe) -Wl,--subsystem,windows `/usr/bin/pkg-config --libs gtk+-win32-2.0` -mno-cygwinは(.o→.exe)の方につけています。 gccのバージョンは、4ではうまく動かなかったので、3.3.3を使っています。 どうぞよろしくお願いします。