2014年06月24日
情報科学類 コンピュータリテラシ
                                       筑波大学 システム情報系 情報工学域
                                       新城 靖
                                       <yas@cs.tsukuba.ac.jp>
このページは、次の URL にあります。
	http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2014/2014-06-24
/c-lang.html
あるいは、次のページから手繰っていくこともできます。
	http://www.coins.tsukuba.ac.jp/~yas/
	http://www.cs.tsukuba.ac.jp/~yas/
The Unix Super Text 第57章 Cの使いかた 参照。
$ mkdir ~/c_progs 
$ cd ~/c_progs 
$ ls 
(何も表示されない。mkdir 直後は、ディレクトリは空。)
$ cp ~yas/public_html/htdocs/coins/literacy-2014/2014-06-24/ex/hello.c . 
$ ls 
hello.c
$ cat hello.c  
#include <stdio.h>
#define NAME "(name)"
int main()
{
        printf("Hello, %s\n", NAME );
}
$ cc hello.c  
$ ls 
a.out   hello.c
$ ./a.out  
Hello, (name)
$ 
c_progs で C programs の意味。
各自、自分の分かりやすい名前に置き換えること。
a.out という
ファイルに保存される。
$ cat error.c  
#include 
#define	 NAME "(name)"
int main()
{
	printf("Hello, %s\n", NAME )
}
$ cc error.c  
error.c:7:30: error: expected ; after expression
        printf("Hello, %s\n", NAME )
                                    ^
                                    ;
1 error generated.
$ 
'' 
この場合は、cc は、実行ファイルを作らない。
ファイル名と行番号をたよりに、プログラムを修正して、
エラーが出なくなるまで cc を実行する。
コンパイル・エラーがでなくなっても、プログラムは完成ではない。コンパイ ラにはわからない(分かり得ない) 間違いは残っている可能性がある。
$ ls 
a.out   hello.c
$ rm a.out  
$ ls 
hello.c
$ cc -o hello hello.c  
$ ls 
hello   hello.c
$ ./hello  
Hello, (name)
$ 
#include で読み込まれる。
stdio.h などのヘッダ・ファイルは、/usr/include/ 以下に
ある。他の場所にある時には、cc コマンドに -I オプションで
指定する。
libc (library C)という
ライブラリにある関数を標準で自動的に取り出して結合する(リンクする)。
libc などよくつかわれるライブラリは、
/usr/lib にある。
libc 以外のライブラリを使う時には、cc に -l オプションを付ける。
たとえば、三角関数 sin(), 指数関数 exp() 等を使う時には、-lm (mathematicsの意味)を指定する。
/usr/lib 以外の場所にあるライブラリを使うには、-L オプションで
ディレクトリのパス名を与える。
例:f1.c, f2.c, f3.c という3つのファイルに含まれているC言語のプログラ ムをすべてコンパイルして、リンクし、完成した実行可能なプログラムを prog という名前のファイルに保存する。
$ ls f1.c f2.c f3.c 
f1.c    f2.c    f3.c
$ cc -o prog f1.c f2.c f3.c 
$ 
毎回、全部のファイルをコンパイルすると、遅い。
ソース・ファイルを変更したプログラムだけをコンパイルしたい。
$ ls f*.c 
f1.c    f2.c    f3.c
$ ls f1.* 
f1.c
$ cc -c f1.c 
$ ls f1.* 
f1.c    f1.o
$ ls f2.* 
f2.c
$ cc -c f2.c 
$ ls f2.* 
f2.c    f2.o
$ ls f3.* 
f3.c
$ cc -c f3.c 
$ ls f3.* 
f3.c    f3.o
$ ls f*.c 
f1.c    f2.c    f3.c
$ ls f*.o 
f1.o    f2.o    f3.o
$ cc -o prog f1.o f2.o f3.o 
$ ./prog  
This is main().
This is f1().
This is f2().
This is f3().
$ 
(分割)コンパイルを楽にするためのプログラム。 どのようなファイルをコンパイルすればよいかの 定義を与えると、ファイルの日付を比較して、 自動的にコンパイルとリンクを行う。
$ ls *.c 
f1.c    f2.c    f3.c    hello.c
$ ls *.o 
ls: *.o: No such file or directory
$ cat Makefile 
all: prog
objs = f1.o f2.o f3.o
prog: $(objs)
        $(CC) -o prog $(objs)
$ make 
cc    -c -o f1.o f1.c
cc    -c -o f2.o f2.c
cc    -c -o f3.o f3.c
cc -o prog f1.o f2.o f3.o
$ ls *.c *.o prog 
f1.c    f1.o    f2.c    f2.o    f3.c    f3.o    hello.c prog
$ 
all: prog objs = f1.o f2.o f3.o prog: $(objs) $(CC) -o prog $(objs)