重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

こんにちは。
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++でしか使えないコマンドラインオプションってありますか?

以上です。
よろしくお願い致します。

A 回答 (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++の記述されてる場所が違うはずです。
    • good
    • 0
この回答へのお礼

kmeeさん、何度も御回答ありがとうございます。

マニュアルについては、参考にさせて頂きます。

>-lオプションとか、ライブラリやオブジェクトファイルの指定って、順番があるのご存知ですか?

それは知りませんでした。
確かに
gcc -v test.cpp -lstdc++
で、実行ファイルをビルドすることができました。

お礼日時:2012/08/11 14:34

>まあ、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
%
    • good
    • 0
この回答へのお礼

wormholeさん、御回答ありがとうございます。

No5にあるように、
-lstdc++
の位置をかえると、僕の環境でもきちんとビルドできました。

何度も御回答ありがとうございました。

お礼日時:2012/08/11 14:41

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

御回答ありがとうございます。

>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++でないと、上手くいかないようです。

お礼日時:2012/08/11 00:05

>ソースファイルをビルドする時に、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に適切なオプションを指定してないから。
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。

Unixのライブラリについては詳しく調べてみます。
また、-timeについては理解できました。

>>>g++は適切な引数でgccを実行するためのもので、g++こそ不要と言えるかもしれません。
>>そんなことはないのでは?
>>gccではなく、g++でしかコンパイルできないC++ソースファイルは、結構ありましたから。
>
>それはgccに適切なオプションを指定してないから。

No4のお礼の、後半に書いたようなことを試したのですが、gccでのコンパイルは上手くいきませんでした。
まあ、g++でコンパイルできているので、g++を使えばいい話ですが、
g++で出来ることはgccで出来るはずなのですよね?

お礼日時:2012/08/11 00:11

せめて、マニュアルに書いてあること位は調べてから質問しましょうよ



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が必要
    • good
    • 0
この回答へのお礼

>せめて、マニュアルに書いてあること位は調べてから質問しましょうよ
>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++ソースファイルは、結構ありましたから。

お礼日時:2012/08/10 04:31

>・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++のマニュアル読めば解ることだけど。
    • good
    • 0
この回答へのお礼

wormholeさん、御回答ありがとうございます。
いつもお世話になっております。

>libgcc.aについてはgccでコンパイルした実行ファイルで使用されるサブルーチンなどが納められているライブラリです。

ソースファイルをビルドする時に、libgcc.aが、そのソースファイルから作成されたオブジェクトファイルとリンクされて、実行ファイルが作成されるという事でしょうか?
それとも、WindowsのDLLのように、実行ファイルが実際に走るときに、使われるのでしょうか?


>読んだそのまま。
>cc1plus(C++のソースからアセンブラのソース(アセンブラソースでなくて中間コードだったかも)を生成するコマンド)
>as(アセンブラソースからオブジェクトファイルを生成するコマンド)
>それぞれがかかった時間です。

申し訳ございません。
聞き方が悪かったです。
cc1plus 0.03 0.01
の0.03および0.01がそれぞれ、cc1plusが何をするのにかかった時間か?
という事を聞きたかったのです。

よろしければ、引き続きよろしくお願い致します。

お礼日時:2012/08/10 03:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

今、見られている記事はコレ!