• ベストアンサー
  • 困ってます

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++でしか使えないコマンドラインオプションってありますか? 以上です。 よろしくお願い致します。

共感・応援の気持ちを伝えよう!

  • 回答数6
  • 閲覧数872
  • ありがとう数7

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • cygwin gccでのコンパイル

    cygwinをインストールをallでインストールし、gccでコンパイルを行おうとしたところ /usr/lib/gcc-lib/i686-pc-cygwin/3.3.3/../../../../i686-pc-cygwin/bin/ld: cannot find -luser32 collect2: ld returned 1 exit status と表示され、コンパイル出来ません。 なにが原因でしょうか。 以上、宜しくお願い致します。

  • g++ というコマンドのコンパイラ

    "g++" というコマンドでC++の".cpp" ファイルをコンパイルできるウィンドウズ用のコンパイラを教えていただけないでしょうか。(出来ればフリーの) また、その使い方を日本語で易しく説明したサイトを教えていただけないでしょうか。

  • Cygwin(gcc) lexライブラリ

    WindowsXPにCygwinのすべての項目をInstallにしてインストールして bison -d abc.y flex abc.l と実行し、 abc.tab.c , abc.tab.h , lex.yy.c ができた状態で gcc abc.tab.c -ll とした時 /user/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: cannot find -ll collect2: ld returned 1 exit status とメッセージが表示されコンパイルできないでのですが gccには標準lexライブラリが無いのでしょうか? それとも別のことが原因なのでしょうか? このエラーの回避法、もしくは別のソフトなどでこれと同様のことができるなら教えてください。

その他の回答 (5)

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

>まあ、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++ の位置をかえると、僕の環境でもきちんとビルドできました。 何度も御回答ありがとうございました。

  • 回答No.4
  • 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++でないと、上手くいかないようです。

  • 回答No.3
  • wormhole
  • ベストアンサー率28% (1475/5186)

>ソースファイルをビルドする時に、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で出来るはずなのですよね?

  • 回答No.2
  • 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++ソースファイルは、結構ありましたから。

  • 回答No.1
  • wormhole
  • ベストアンサー率28% (1475/5186)

>・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が何をするのにかかった時間か? という事を聞きたかったのです。 よろしければ、引き続きよろしくお願い致します。

関連するQ&A

  • cygwinのgccが、エラーになってしまいます。

    テストプログラム $ cat test.c #include <stdio.h> int main (void) { printf("Hello, World!\n"); return 0; } これを、コンパイルすると $ gcc test.c gcc: error trying to exec '/usr/lib/gcc/i686-pc-cygwin/4.5.3/cc1.exe': execv: Bad address /usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../libcygwin.a(libcmain.o):(.text+0xba): undefined reference to `_WinMain@16' collect2: ld はステータス 1 で終了しました と、このようなエラーが出てきました。 ファイルを確認しても、何も作られていません。 $ ls test.c 対処方法を、ご教示願います。

  • g++コンパイルしながら使用されたヘッダー・ライブラリのフルパスを表示させたい

    宜しくお願い足します。 : posix gcc 3.2.2 20030222 (Red Hat Linux 3.2.2-5) g++: no input files の環境です。 $ g++ -o hoge hoge.cc としてコンパイルしながらにコンパイラがどのヘッダー、ライブラリを使用したかフルパスで表示させるにはどのようなオプションを指定すればいいのでしょうか?

  • cygwinでX-window

    自宅のWindowsXPのPC上で、X-Window関連(<X11/Xlib.h>をincludeする等で)のC言語を勉強したいと思い、 VisualCで最初に試したのですが上手くいかず、cygwinをインストールしました。 コンパイル時に、 /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: cannot find -lX11 collect2: ld returned 1 exit status とエラーが出て実行ファイルが出来ません。 ちなみに、cygeinをインストール時にパッケージは全てDLしました。 初歩的な質問かもしれませんがよろしくお願いします。

  • cygwinで「sl」コマンドを使用できるようにしたい。

    cygwinで「sl」コマンドを使用できるようにしたい。 お世話になっております。 cygwinでslコマンドを使用したくて http://www.tkl.iis.u-tokyo.ac.jp/~toyoda/ からダウンロードしたのですが、 $ make cc -O -o sl sl.c -lcurses -ltermcap /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: cannot find -ltermcap collect2: ld returned 1 exit status make: *** [sl] Error 1 と出ましてmakeできません。 過去の質問などを検索したのですが、(termcap)、libtermcap、libtermcap-devel を入れればよいと出たのですが、入れ方について調べると、yumでインストールするとあるのですが、 私のcygwinではyumが使えません。 cygwinのセットアップから追加インストールしようとしたのですがlibtermcapがなかったです。 ncursesはこのセットアップから入れることができたのですが。 なんとかweb上から持ってくることはできないでしょうか? yumを使えるようにするということから調べると、とても時間がかかりそうなので できたらwebから足りないライブラリをダウンロードできたらと思っています。 どこに置いたらよいのかも教えてもらえますと助かります。 初心者な質問で本当に申し訳ないですが、ご教授の程宜しくお願い致します。

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

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

  • 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を使っています。 どうぞよろしくお願いします。

  • 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でのフャイルのやり取りが出来るのでしょうか? もし誰か知っていたら教えてください お願いします

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

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

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

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