こんにちは。
本日は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
以上です。