読者です 読者をやめる 読者になる 読者になる

望月いちろうのREADME.md

書き溜めておいた技術記事や旅行記のバックアップです。

C言語 - コンパイラ の入手とコンパイルの方法 - 初心者向け

f:id:mochizuki_p:20161221101748p:plain

C言語はコンパイルが必要な言語です。つまり、ソースコードをそのまま実行することはできません。

まずコンパイルをして、機械語に変換することで始めてプログラムを実行することができます。

実際のコンパイルでは、プリプロシングやアセンブラへの変換などの何段階かの中間過程があるのですが、ここではそれらの解説は省略します。

つまり、この記事ではソースコードをコンパイルして実行可能なプログラムを作成できるようにするのが目的です。

なぜこの記事を書くのか?

世の中には数多くのC言語入門書がありますが、それらの本には何故かプログラムを実行するために、必要になるコンパイラ周りの解説が、あまりに貧弱または皆無であることが多いです。

このようなあまりに不親切な入門書が氾濫している状況で、不足している情報を補うための記事です。

まず最初に

主要なコンパイラ一覧

一般的に使用されているのは主に3つ(異論があるかもしれませんが)

gcc

GNU Compiler Collectionの略です。世界で最も権威のあるオープンソース・プロジェクトであるGNU(グヌー)が作成したコンパイラです。

通常、C言語のコンパイラといえばこれが最も一般的で、特にLinux環境であれば、デフォルトでインストールされています。

gccの特徴としては、完全に無料なフリーソフトでありながら、極めて優れた性能を両立しているということです。通常の用途であれば、gccが最も優れた選択肢であると自信を持って言えるでしょう。

clang

イリノイ大学がリードするコンパイラ基盤であるLLVMから派生したC系列言語用のコンパイラです。その特徴としては、アップルコンピュータが積極的な開発支援をしており、特にObjective-C(Objective-C++)のコンパイルにはClangを使用するのがベストです。

Clangはgccに比べて、より軽量で、コンパイルが早く、警告メッセージが丁寧である。という特徴があります。

アップルコンピュータが開発するプラットフォーム(iOS、OSX)上での開発にはClangは必須です。もちろんClangはクロスプラットフォームで動作することを意図して設計されており、実際にUnix環境で使用される少なからぬソフトウェアがClangでコンパイルされて配布されています。ライセンスはBSD派生であり、当然フリーです

Visual C++

Microsoftが提供する各種プラットフォーム用のコンパイラです。Windows環境でのソフトウェア開発には必須です。

欠点としてはC/C++の標準規格を必ずしも順守しておらず、一方で独自の拡張がなされているという点です。

導入はWindowsの統合開発環境であるVisual Studioのインストールをすれば、必ず付属しています。

gccの使い方

今回は最も一般的なコンパイラである。gccの導入と、それを利用したコンパイルの方法について解説を行います。

gccのインストール

Linuxの場合

デフォルトでインストールされています。

Macの場合

Homebrewを使うと便利です。

brew install gcc

ビルドには1〜2時間かかることがあります。夜中に実行しておくと良いでしょう。

インストールを確認する

以下のコマンドを入力

gcc -v

以下のように出力されればOKです

Using built-in specs.
COLLECT_GCC=/usr/local/Cellar/gcc/6.2.0/bin/g++-6
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/6.2.0/libexec/gcc/x86_64-apple-darwin14.5.0/6.2.0/lto-wrapper
Target: x86_64-apple-darwin14.5.0
Configured with: ../configure --build=x86_64-apple-darwin14.5.0 --prefix=/usr/local/Cellar/gcc/6.2.0 --libdir=/usr/local/Cellar/gcc/6.2.0/lib/gcc/6 --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-6 --with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr --with-mpc=/usr/local/opt/libmpc --with-isl=/usr/local/opt/isl --with-system-zlib --enable-libstdcxx-time=yes --enable-stage1-checking --enable-checking=release --enable-lto --with-build-config=bootstrap-debug --disable-werror --with-pkgversion='Homebrew gcc 6.2.0' --with-bugurl=https://github.com/Homebrew/homebrew/issues --enable-plugin --disable-nls --enable-multilib
Thread model: posix
gcc version 6.2.0 (Homebrew gcc 6.2.0) 


gccでソースコードをコンパイルする

コマンドgccを利用します。

gccを利用する際には複数のオプションを駆使する必要があります。最低限必要なものとしては-oがあります。この後に任意のファイル名を指定することで、コンパイラから吐き出される実行ファイルの名前をつけることができます。このオプションをつけない場合。実行ファイルはa.outという名前に自動的になります。

gcc hello.c -o hello

そのほか便利なオプション

-Wall

各種警告メッセージを出力します。警告メッセージはすべて英語なので、苦手な人にはキツイかもしれませんが、実行時に問題になるバグを事前に発見できるかもしれません。

gcc hello.c -o hello -Wall

-Wextra

-Wallに加えてより厳密な警告メッセージを出力します。

-I

利用したいヘッダファイルのパスを指定します。<stdio.h>や<math.h>の様な、/usr/includeに格納されている標準ライブラリ以外のファイルを利用したいときは、これを利用して、ヘッダファイルのパスを指し示す必要があります。

-O3

最大限の最適化を行います。つまりプログラムの性能をできるだけ引き出すようにします。欠点はコンパイル時間とコンパイル時に使用するメモリ容量の増加です。

-D

実行時に特定のマクロを有効にします。

最も一般的で便利な利用法はデバッグに使用するという手法です。

以下のようなソースファイルを例にします。

test.c

#include <stdio.h>


int main(int argc, char** argv){

    print("hoge");
    #ifdef DEBUG    
       printf("debug");
    #endif

    return 0;
}

特にオプションを指定しない場合、#ifdef DEBUGと#endifで囲われた部分は実行されません。

gcc test.c -o test

実行!

./test

すると

hoge

マクロの文法上、DEBUGが定義されていないのでコンパイル時には無視されるからです。

しかし、以下のようなオプションを使ってDEBUGを有効化すると・・・

gcc -D DEBUG test.c -o test

実行!

./test

すると

hoge
debug

となり、マクロで囲われた部分が実行されています。

このようにデバッグ時に特定の動作や変数の中身を確認するための関数を設定して、本番では出力させたくない場合は、この手法が有用です。

その他のオプション

gccにはその他にも便利なオプションがあります。 しかし、初心者には少々難しい点があるので別に機会に回すことにします。

とりあえずこれだけあれば初心者には十分だと思います。

Mac(OSX)の場合の注意点

OSX上でgccと入力すると何故かClangがリンクされています。つまり、gccを呼び出したつもりが、実際はClangが呼び出されているという状況が発生します。

これを避けるにはCellarに入っているgccを直接呼び出すのが良いでしょう。

つまり、/usr/local/Cellar/gcc/6.2.0/bin/gcc-6(これは環境とgccのバージョンによって異なるはずです) を直接呼び出します。