忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

分割コンパイル

ども、こんにちわ~

ここまで来たら割とやけな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

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]