バイナリは異なります。
それらはどのように違うのですか?
GCC は、元のソース ファイル名と使用されたオプションに関する情報をファイルに埋め込むため、内容が同じであっても、ファイル名が異なると常にいくつかの違いがあります。
プログラムを C および C++ としてコンパイルすると、C++ バージョンが にリンクされていることがわかります。libstdc++
これは、を使用してリンクすると自動的に発生しますg++
。代わり gcc
にリンクを使用すると、バイナリはほぼ同じになります。
gcc
C++ プログラムのコンパイルに使用できることに注意してください。gcc
およびg++
バイナリは、ファイル名を確認し、正しいコンパイラ バイナリ ( cc1
C の場合cc1plus
、C++ の場合) を呼び出して実際のコンパイルを実行する単なるドライバです。詳細については、http: //gcc.gnu.org/onlinedocs/gcc/Invoking-G_002b_002b.htmlを参照してください。
これは、同一のソース コードの場合、アセンブラー出力の唯一の違いは元のファイル名を示す文字列であり、オブジェクト ファイルは同じサイズであることを示しています。
$ cat f.c
cat: f.c: No such file or directory
$ rm f.c
$ cat > f.c
int main(int argc, char** argv)
{
return 0;
}
$ ln -s f.c f.cc
$ gcc f.c -S -o f.c.s
$ g++ f.cc -S -o f.cxx.s
$ diff f.c*.s
--- f.c.s 2012-08-26 13:45:58.109711329 +0100
+++ f.cxx.s 2012-08-26 13:46:00.482634256 +0100
@@ -1,4 +1,4 @@
- .file "f.c"
+ .file "f.cc"
.text
.globl main
.type main, @function
$ gcc f.c -c -o f.c.o
$ g++ f.cc -c -o f.cxx.o
$ ls -l f.c*.o
-rw-rw-r--. 1 jwakely users 1240 Aug 26 13:46 f.c.o
-rw-rw-r--. 1 jwakely users 1240 Aug 26 13:46 f.cxx.o
そして、最終的な実行可能ファイルでは、C++ 標準ライブラリがリンクされているかどうかにかかわらず、リンク方法に違いがあります。
$ gcc f.c.o -o a.c.out
$ gcc f.cxx.o -o a.cxx.out
$ g++ f.cxx.o -o a.cxx.libstdcxx.out
$ ls -l a.c*.out
-rwxrwxr-x. 1 jwakely users 6323 Aug 26 13:48 a.c.out
-rwxrwxr-x. 1 jwakely users 6468 Aug 26 13:48 a.cxx.libstdcxx.out
-rwxrwxr-x. 1 jwakely users 6324 Aug 26 13:48 a.cxx.out
C++ 標準ライブラリが必要ない場合は、リンクしないでください。