gcc

提供: MacWiki
移動: 案内検索

MacOSX の DeveloperToolsにも付属している、フリーの高性能 C/C++/Objective-C/Fortran/... コンパイラ。

なお、Apple は将来的には gcc を clang に変える方向にある。

入手先[編集]

下記からも gcc および llvm-gcc などを含む一式を入手できる。Mac OSX 10.7 (Lion) (Xcode 4.2以降)で llvm-gcc-4.2 のみとなったが、gcc-4.2 を動かしたい際に、入手に便利。

インストール後は

$ ls -l `which CC` `which gcc` `which gcc-4.2`
lrwxr-xr-x  1 root  wheel   5  5 23 18:39 /usr/bin/CC -> clang
lrwxr-xr-x  1 root  wheel  12  5 23 18:39 /usr/bin/gcc -> llvm-gcc-4.2
-rwxr-xr-x  1 root  wheel  113024  5 16  2011 /usr/bin/gcc-4.2
$ gcc-4.2 -v
gcc version 4.2.1 (Apple Inc. build 5666) (dot 3)

なおこのgcc-4.2 (apple-gcc42) のソースコードは,

また、Homebrewを使ってもインストールできる

$ brew tap homebrew/dupes
$ brew install apple-gcc42
$ brew untap homebrew/dupes

最適化オプション[編集]

PPC 機でコンパイル時に -fast というオプションをつけると、 バイナリファイルが G5 向けに最適化されます。

また、G4, G5 向けに最適化する場合は -fast -mcpu=7450 として下さい。 ただし、このオプションで作られたバイナリは、初期の G4プロセッサ(PowerPC 7410等)では動作しませんので注意して下さい。

  • G3: -mcpu=750
  • 初期の G4: -mcpu=7400
  • 第二世代の G4: -mcpu=7450
  • G5: -mcpu=G5

最適化オプションについての詳細は、mac gcc を参照して下さい。


4倍精度計算[編集]

Xcode1.5-gcc3.3.2 では4倍精度計算をしようとすると

warning: use of `long double' type; its size may change in a future release

と警告されていた。

  • Tiger (10.4.5, gcc version 4.0.1 (Apple Computer, Inc. build 5247))では G5 で4倍精度計算が可能になった。
    • G4, G3 でも可能です。
$ cat testQuadPrec.c
#include <stdio.h>
#include <math.h>

int main()
{
  double x;
  long double y;
  x = 1.0/3.0;
  y = 1.0l/3.0l;

  printf("x %2d %32.31f\n", sizeof(x),x);
  printf("y %2d %32.31Lf\n", sizeof(y),y);

  x = 0.33333333333333333333333333333333333333;
  y = 0.33333333333333333333333333333333333333L;

  printf("x %2d %32.31f\n", sizeof(x),x);
  printf("y %2d %32.31Lf\n", sizeof(y),y);
  printf("pi %32.31f\n", 4.0*atan(1.0));
  printf("pi %32.31Lf\n", 4.0*atanl(1.0));

  return 0;
}
$ gcc -O3 testQuadPrec.c
$ ./a.out 
x  8 0.3333333333333333148296162562474
y 16 0.3333333333333333333333333333333
x  8 0.3333333333333333148296162562474
y 16 0.3333333333333333333333333333333
pi 3.1415926535897931159979634685442
pi 3.1415926535897932384626433832795


  • IEEE 規格によりますと有効精度が 80 bit -- 128 bit(?) であれば4倍精度浮動小数点数(?)と称しても良いようです。
    • どうやら、本当は、拡張倍精度(extended double or long double precision, 80 bit以上) と4倍精度(quadruple precision, 128 bit)を区別して考える必要があるようです。
    • そして、Intel Mac (IntelCore) においては、有効精度が 80 bit のlong double計算をCPUネイティブにサポートするようです。
    • このCPUでサポートされている80 bit精度なlong doubleについて議論している資料を見つけました。これの p. 62 or later です: http://www.cs.berkeley.edu/~wkahan/JAVAhurt.pdf ほかにもこれです:http://www.cs.berkeley.edu/~wkahan/ARITH_17.pdf
      • しかし 128 bit の4倍精度を欲しい人はソフトウェア(コンパイラ?)で実現する必要があるようです。
  • Intel Mac (10.4.5, gcc version 4.0.1 (Apple Computer, Inc. build 5250)) でのテスト結果。以下を見る限り、四則演算と代入で 16 byte 分の精度が確保されていないようです。
$ cc -O3 -march=i686 -mtune=pentium-m -m128bit-long-double testQuadPrec.c 
$ ./a.out 
x  8 0.3333333333333333148296162562474
y 16 0.3333333333333333333423683514374
x  8 0.3333333333333333148296162562474
y 16 0.3333333333333333333423683514374
pi 3.1415926535897931159979634685442
pi 3.1415926535897932385128089594062
$ cc -O3 -march=i686 -mtune=pentium-m  testQuadPrec.c 
$ ./a.out 
x  8 0.3333333333333333148296162562474
y 16 0.3333333333333333333423683514374
x  8 0.3333333333333333148296162562474
y 16 0.3333333333333333333423683514374
pi 3.1415926535897931159979634685442
pi 3.1415926535897932385128089594062
$ cc -O3 -march=i686 -mtune=pentium-m -m96bit-long-double testQuadPrec.c 
$ ./a.out 
x  8 0.3333333333333333148296162562474
y 12 0.3333333333333333333423683514374
x  8 0.3333333333333333148296162562474
y 12 0.3333333333333333333423683514374
pi 3.1415926535897931159979634685442
pi 3.1415926535897932385128089594062


変数のサイズ[編集]

各変数型のサイズを知るには、安直に:

#include <stdio.h>
int main( int argc, char* argv[] )
{
  printf( "%d %d", sizeof(int), sizeof(double) );
  return 0;
}


gccのオプション[編集]

  • 知っていると便利な gcc のオプション

http://mail.unixuser.org/~euske/doc/gccopts/index.html http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

例:c89準拠としてコンパイル

$ gcc -ansi -pedantic -fstrict-aliasing -Wall -Wextra -Wmissing-declarations test.c

プロトタイプ必須とするにはさらにオプションを加える

-Wstrict-prototypes -Wmissing-prototypes

(上記では低レベルのミスを見逃さないように警告オプションをつけています.パーフェクトではありません.)

gccの乱数出力[編集]

Mountain Lion, Apple gcc (Xcode 4.6.3) では次のコードが同じような値を出力し続ける。

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main()
{
  double r1;
  srand((unsigned) time(NULL));
  r1 = (0.0+rand())/RAND_MAX;
  printf( "%lf\n", r1 );
  return 0;
}

Snow Leopard(Xcode 3.2.6)では場合により動作する(K.T. さん情報提供)

  1. (0.0 + rand())/RAND_MAX --> strange
  2. (0.0 + rand())/(double)RAND_MAX --> OK
  3. (double)rand()/(double)RAND_MAX --> OK
  4. (double)rand()/RAND_MAX --> OK


Wiki内の関連ページ[編集]