なんだかGoodVibes

日々の勉強メモです。

【C】[超入門] C言語でコンパイル

こんにちは。
本日はC言語メモです。

概要

C言語で開発を行う際、いつもコンパイルってどうするんだっけ??
ってなるので自分用メモです。

本記事では、
gccを使用したコンパイル方法について記載します。


.cファイルのみの場合

以下のようなディレクトリ階層とします。

app
  ┗ main.c

main.cファイルの内容は以下です。

#include <stdio.h>

int main() {

    printf("Hello World!\n");
    return 0;
}

こちらをコンパイルしましょう。
以下のコマンドを実行しましょう。

$ gcc -c main.c 

実行後は、main.cの他にmain.oが生成されます。

$ ls
main.c main.o

-c オプションを指定して実行すると、.cファイルをコンパイル
オブジェクトファイルを生成します。

次に、実行ファイルを作成します。
以下のコマンドを実行しましょう。

$ gcc -o main main.o

実行後は、mainというファイルが生成されています。

$ ls
main   main.c main.o

-o オプションを指定して実行すると、
実行ファイルを生成します。

生成されたmainを実行すると以下のようになります。

$ ./main 
Hello World!


.hファイルが存在する場合

先程の階層にヘッダファイル(.h)を追加します。

app
 ┣ main.h
 ┗ main.c

各ファイルの内容は以下です。

  • main.c
#include <stdio.h>
#include "main.h"

int main() {

    printf("My Name Is %s!\n", DEF_NAME);
    return 0;
}
  • main.h
#ifndef MAIN_H
#define MAIN_H

#define DEF_NAME   ("BOB")

#endif // MAIN_H

では、コンパイルしていきます。
今回のパターンの場合、main.cとmain.hが同一階層に存在するので
先ほどと同様にコンパイル~実行ファイル作成が可能です。

$ gcc -c main.c
$ ls
main.c main.h main.o
$ gcc -o main main.o
$ ls
main   main.c main.h main.o
$ ./main 
My Name Is BOB!


.hファイルが存在する場合(他の階層)

ヘッダファイルの位置を先程と異なる場所にします。

indlude
 ┗ main.h
app
 ┗ main.c

先ほどと同じようにコンパイルするとエラーとなります。

$ gcc -c main.c
main.c:2:10: fatal error: 'main.h' file not found
#include "main.h"
         ^~~~~~~~
1 error generated.

ヘッダファイルの場所を教えてあげる必要があります。
ヘッダファイルのパスを指定するには-Iオプションを使用します。
コンパイル後のコマンドは先程と同様です。

$ gcc -c main.c -I../include
$ ls
main.c main.o
$ gcc -o main main.o
$ ls
main   main.c main.o
$ ./main
My Name Is BOB!


複数のオブジェクトファイルから実行ファイルを生成

以下のディレクトリ構成で、main.cとsub.cから
mainという名前の実行ファイルを生成しましょう。

include
 ┣ main.h
 ┗ sub.h
app
 ┣ main.c
 ┗ sub.c

各ファイルの中身は以下です。

  • main.h
#ifndef MAIN_H
#define MAIN_H

#include "sub.h"

#define DEF_NAME   ("BOB")

#endif // MAIN_H
  • sub.h
#ifndef SUB_H
#define SUB_H

#define DEF_COLOR   ("Yellow")

int printColor();

#endif // SUB_H
  • main.c
#include <stdio.h>
#include "main.h"

int main() {

    printf("My Name Is %s!\n", DEF_NAME);
    printColor();
    return 0;
}
  • sub.c
#include <stdio.h>
#include "sub.h"

int printColor() {

    printf("My Color Is %s\n", DEF_COLOR);
    return 0;
}

コンパイルは先程と同様に
main.c、sub.cそれぞれに対して行います。
異なる部分は、実行ファイルを生成する際です。
今までのパターンでは、main.oのみを指定していましたが
今回は、sub.oも指定してあげます。

$ gcc -c main.c -I../include
$ ls
main.c main.o sub.c
$ gcc -c sub.c -I../include
$ ls
main.c main.o sub.c  sub.o
$ gcc -o main main.o sub.o
$ ls
main   main.c main.o sub.c  sub.o
$ ./main 
My Name Is BOB!
My Color Is Yellow



以上です。