ども、こんにちわ~
ここまで来たら割とやけなZAKIです

意味の無い意地を張っています
さて、今回のテーマは
「分割コンパイル」です。
ブログタイトルに釣られた人。
どんまい


毎度おなじみサンプルファイルは
こちら
大西先生が便利なものを作ってくださってているお陰で、コンパイルのやり方自体は簡単です

いつもcl2にソースファイルを足すだけです
cl2 test.c bunkatu.c dglib.obj
と、DOS窓に書けばコンパイルできます。
それでは、分割したソースの中を解説していきましょう
まず、bunkatu.cから。
1行目に
bunkatu.hをインクルードしていますが、
今の時点でこれは無くても大丈夫です。
6行目、グローバル変数ですが、
staticがついていますね。
この場合、g_cnt変数は
他のソースからアクセスできなくなります
なので、この変数が原因でバグが出たときは、
このソースを調べるだけで済みます
その下の関数も同じ意味で、
バグが出てもその関数を読んでいるのはこのソースのみなので、デバッグが楽になります
その下の2行続いて関数が書いてあるのは
プロトタイプ宣言です。
関数が沢山になってくると、他の人が下のほうまで関数を見ていくのは大変です

なので、プロトタイプ宣言
でどんな関数があるかを明記しておくとわかりやすいのです
ちなみに、この二つには
staticがついていないので、
外部のソースで呼ばれる可能性があることがわかります
外部からは呼ばれないものにはstaticを付けるというルールがあると、必然的にそういうことがわかるので、
関数を追いかける必要もなくなります
こういうルールを決めた書き方はチーム製作ではオススメです

あとの関数の中身はテスト用なので適当です。
次はbunkatu.hを見てみましょう。
.hのつくソースファイルは
「ヘッダ」と呼ばれます。
ソースファイルの頭でインクルードされるのが語源です。
……嘘です
まず、1行目。
これはコメントの通り、1
つのソースで1回しかこのヘッダを読まないようにしています
externの宣言しか書いてない場合は大丈夫ですが、
構造体の宣言、define等が書いてあると、インクルードしたソース内で2回これが定義されることになるので、
同じのが2個あるぞーっとコンパイラに起こられます

#pragma onceがあるとこれをコンパイラ防いでくれます

ちなみ、VisualStudio(VC++)のコンパイラ(CLコンパイラ)でしか使えないので、要注意です

さて、その下の
externの関数宣言。
externとは
「その後ろのものがどこかにあるよー」という宣言です。
なので、その関数を使っているソースで、「そんな関数しらないぞ」というエラーを防げます
ちなみに、
staticとexternを同時には使えません
まぁ使用用途をみれば大体わかりますよね

基本的にヘッダはソースファイルと同じ名前にすることが多いです
そのほうが、ヘッダからソースの内容がわかったり、名前からどのソースの宣言があるわかりやすいからです。
あとは、ヘッダを目的の(関数を使いたい)ソースへインクルードしてやれば関数が使えるようになります

VisualStudioプロジェクトのほうでもやり方は一緒で、コンパイル時は普通にF5などを押してやれば動きます。
よくあるエラーについて補足。
未解決の外部シンボル _drawCntが関数 _Main で参照されました。
こういうエラーを僕は
リンクエラーとよんでいます。
ソースファイルをコンパイルした後に
複数のソースファイルの内容をまとめる作業(リンク)するときに起こるエラーです
コンパイルが終わった後に起こるということは、文法的には間違っていないので、
#includeなど、
ヘッダ系でエラーを探します
この場合はmain()関数の中でtest.cが知らない関数(drawCnt)を見つけたときに起こります。
原因としては、
-
cl2をするときにbunkatu.c(main関数の書いてないソースファイル)を付け忘れている
-
test.c(main関数の書いてあるソース)でbunkatu.hをインクルードしていない
-
(または、ソース内でextern修飾子つきのdrawCnt関数のプロトタイプ宣言をしていない)
って、感じだと思います。
なので、これを直してやれば、うまくいくはずです


と、こんな感じで分割コンパイルについて説明してみましたが、どうでしょうか?
わかりづらければ、どんどん質問してくださいね~
あと、GESメンバーならブログ記事で書いてくれてもいいです。
あ、それおもしろいかもw
わからないやつ vs 教えるやつ みたいな論争が起こったらおもしろいなぁ
まぁ、気軽に記事かいたってくださいw
それでは今回はこの辺で。
あでゅー

ノシ
[0回]
PR
COMMENT