
こんにちは。
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++でしか使えないコマンドラインオプションってありますか?
以上です。
よろしくお願い致します。
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++の記述されてる場所が違うはずです。
kmeeさん、何度も御回答ありがとうございます。
マニュアルについては、参考にさせて頂きます。
>-lオプションとか、ライブラリやオブジェクトファイルの指定って、順番があるのご存知ですか?
それは知りませんでした。
確かに
gcc -v test.cpp -lstdc++
で、実行ファイルをビルドすることができました。
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
%
wormholeさん、御回答ありがとうございます。
No5にあるように、
-lstdc++
の位置をかえると、僕の環境でもきちんとビルドできました。
何度も御回答ありがとうございました。
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
の結果を比べてください。違うオプションが指定されているはずです。
御回答ありがとうございます。
>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
- 回答日時:
>ソースファイルをビルドする時に、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
- 回答日時:
せめて、マニュアルに書いてあること位は調べてから質問しましょうよ
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
- 回答日時:
>・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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
” OS ビルド ” の意味が分か...
-
Makefile作成時の拡張子.oとは?
-
1 つ以上の複数回定義されてい...
-
LoadLibraryについて
-
ビルドから除外されたソースの...
-
コンパイルエラー:ユーザ定義...
-
ILSpyで、デコンパイルできない。
-
構造体をファイルに出力できません
-
NETCOBOLのサブプログラムについて
-
クリティカルエラー Expressio...
-
exe内に記述したパスワードにつ...
-
マクロ コンパイルがグレーバック
-
漢字のコメントをはずすとコン...
-
borlandでコンパイルすると、「...
-
プリコンパイルエラーについて
-
VB6で開発中…標準モジュール間...
-
PRO*C コンパイルエラー
-
c言語gcc.exeにコンパイルしよ...
-
エクセルVBAではRound...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
” OS ビルド ” の意味が分か...
-
VBAを何回も作り直して、容量が...
-
エクセルVBAではRound...
-
Makefile作成時の拡張子.oとは?
-
「fatal error C1189」を回避す...
-
C言語でヘッダファイルにグロー...
-
ILSpyで、デコンパイルできない。
-
<math.h>があるのにsqrtが・...
-
外部シンボル "_main"は未解決です
-
マクロ コンパイルがグレーバック
-
セミコロンについて
-
コンパイルエラー:ユーザ定義...
-
【VC++6.0(MFC)】警告「LINK : ...
-
1 つ以上の複数回定義されてい...
-
VB6とInputManソフトの関係
-
C言語でmからnまでの合計を求め...
-
ExcelVBAで『ByRef 引数の型が...
-
コンパイルに失敗しました、と...
-
漢字のコメントをはずすとコン...
-
C言語のコンパイルができません
おすすめ情報