情報処理のWeb教科書―IPA情報処理試験対策のお供に!
分割コンパイルやユーザ定義のヘッダーファイルの活用などgccコマンドの知識が必要です。gccコマンドのオプションの知識およびgccコンパイラーの使い方について掘り下げていきます。
この記事の目次です。
1. gccコンパイラのインストール
2. gccコマンドのオプション一覧
3. C言語の入門プログラムのコンパイル
4. 分割コンパイル
5. ヘッダーファイルの作成方法
6. 共有ライブラリの作成方法
7. その他のオプション
以降ではWindowsとLinux上にgccをインストールする方法を見ていきます。
MinGWは Minimalist GNU for Windows"の略で、ネイティブのWindowsアプリケーションを開発するために必要な最小限の環境を提供するツールセットがまとめられています。
Windows版のgccコンパイラのMinGWのインストール方法について解説しています。
Linux版のgccのインストール方法についてみていきます。
UbuntsなどDebian系はopt-getでインストールできます。
$ sudo apt-get install gcc
CentOSやFedraなどRed Hat Enterprise Linux系はyumでインストールできます。
$ sudo yum install gcc
Linuxとは、WindowsやMacと同じOSの1つです。読み方はリナックスです。Linuxとはどのようなものかの説明を簡単にまとめています。 またネタとして使える日本産の軽量ディストリビューションのlinuxbeanの情報、コマンドラインの「$」「#」「cd」「~」記号の意味などの入門者にとってよくわからない点をわかりやすくまとめています。
gccコマンドのオプションは--helpオプションで確認できます。以下はその出力になります。
> gcc --help Usage: gcc [options] file... Options: -pass-exit-codes Exit with highest error code from a phase --help Display this information --target-help Display target specific command line options --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...] Display specific types of command line options (Use '-v --help' to display command line options of sub-processes) --version Display compiler version information -dumpspecs Display all of the built in spec strings -dumpversion Display the version of the compiler -dumpmachine Display the compiler's target processor -print-search-dirs Display the directories in the compiler's search path -print-libgcc-file-name Display the name of the compiler's companion library -print-file-name=<lib> Display the full path to library <lib> -print-prog-name=<prog> Display the full path to compiler component <prog> -print-multiarch Display the target's normalized GNU triplet, used as a component in the library path -print-multi-directory Display the root directory for versions of libgcc -print-multi-lib Display the mapping between command line options and multiple library search directories -print-multi-os-directory Display the relative path to OS libraries -print-sysroot Display the target libraries directory -print-sysroot-headers-suffix Display the sysroot suffix used to find headers -Wa,<options> Pass comma-separated <options> on to the assembler -Wp,<options> Pass comma-separated <options> on to the preprocessor -Wl,<options> Pass comma-separated <options> on to the linker -Xassembler <arg> Pass <arg> on to the assembler -Xpreprocessor <arg> Pass <arg> on to the preprocessor -Xlinker <arg> Pass <arg> on to the linker -save-temps Do not delete intermediate files -save-temps=<arg> Do not delete intermediate files -no-canonical-prefixes Do not canonicalize paths when building relative prefixes to other gcc components -pipe Use pipes rather than intermediate files -time Time the execution of each subprocess -specs=<file> Override built-in specs with the contents of <file> -std=<standard> Assume that the input sources are for <standard> --sysroot=<directory> Use <directory> as the root directory for headers and libraries -B <directory> Add <directory> to the compiler's search paths -v Display the programs invoked by the compiler -### Like -v but options quoted and commands not executed -E Preprocess only; do not compile, assemble or link -S Compile only; do not assemble or link -c Compile and assemble, but do not link -o <file> Place the output into <file> -pie Create a position independent executable -shared Create a shared library -x <language> Specify the language of the following input files Permissible languages include: c c++ assembler none 'none' means revert to the default behavior of guessing the language based on the file's extension Options starting with -g, -f, -m, -O, -W, or --param are automatically passed on to the various sub-processes invoked by gcc. In order to pass other options on to these processes the -W<letter> options must be used. For bug reporting instructions, please see: <http://gcc.gnu.org/bugs.html>.
C言語の簡単なプログラムが記述できるようにするため、初歩的な構文や制御構造について解説していきます。 なお、特に断らない限りWindows版のgccの例を記載しています。
C言語のプログラムは、ソースコードを記述したソースファイルを作成し、ソースファイルのコンパイル(リンク)を行って実行形式ファイルを作成します。 そして、実行形式ファイルを起動することでプログラムが実行出来ます。
たとえば、作成から実行までは次のような流れになります。
ここではコマンドラインに「Hello World!!」と表示するプログラムを作成します。
Windowsに標準で搭載されているnotepadエディタを使用してソースファイルを作成します。
コマンドプロンプトを起動して、ファイル名を指定して、notepadコマンドを実行します。
notepad hello.c
以下のコードを入力して、保存します。
#include <stdio.h> int main(void) { printf("Hello World!!\n"); return 0; }
dirコマンドでファイル一覧を表示すると「hello.c」のソースファイルが確認できます。
dir hello.c
gccコマンドでコンパイルします。
gcc hello.c
dirコマンドでファイル一覧を表示して、a.exeという実行形式ファイルができていることを確認します。
a.exe hello.c
a.exeと入力すると実行できます。
a.exe Hello World!!
複数のソースファイルから分割コンパイルして1つの実行形式ファイルする方法について見ていきます。
分割コンパイルの流れは以下のようになります。
分割コンパイルの実施例です。
以下の2つのソースファイルを作成します。
#include <stdio.h> void hello(); int main(void) { hello(); return 0; }
#include <stdio.h> void hello() { printf("Hello World!!\n"); }
それぞれのファイルをgccの-cオプションでコンパイルして.oファイルを作成します。
gcc -c Main.c gcc -c Hello.c
gccの-oオプションで2つのMain.oとHello.oファイルをリンクして実行形式ファイルを作成します。
gcc Main.o Hello.o -o sample.exe
作成したsample.exeを実行するとHello World!!と表示されます。
sample.exe Hello World!!
C言語のヘッダ―ファイルの作成方法について見ていきます。
ヘッダーファイルとは、関数のプロトタイプ宣言などの記述をまとめたファイルのことをいいます。 複数のソースファイルで同じ#include文を記述したりする場合に便利です。
#include文で「#include <stdio.h>」や「#include "hello.h"」のように記述して使用します。 標準ライブラリのヘッダーファイルは「<」「>」を使用し、ユーザ定義のヘッダーファイルは「"」「"」を使用してヘッダーファイルを指定します。
ヘッダーファイルの作成例です。
まずは以下のヘッダーファイルを作成します。
#ifndef SAMPLE_H #define SAMPLE_H #include <stdio.h> void hello(); #endif
上記のように#include文や関数のプロトタイプ宣言などを記述します。 また、多くの場合、同じものを何度も読み込まないようにする工夫として、「#ifndef ~ #endif」マクロを使用します。
以下の2つのソースファイルを作成します。
#include "sample.h" int main(void) { hello(); return 0; }
#include "sample.h" void hello() { printf("Hello World!!\n"); }
sample.hと同じフォルダにソースファイルを配置し、 それぞれのファイルをgccの-cオプションでコンパイルして.oファイルを作成します。
gcc -c Main.c gcc -c Hello.c
gccの-oオプションで2つのMain.oとHello.oファイルをリンクして実行形式ファイルを作成します。
gcc Main.o Hello.o -o sample.exe
作成したsample.exeを実行するとHello World!!と表示されます。
sample.exe Hello World!!
共有ライブラリの作成方法を見ていきます。
実行形式ファイルのいつも使う処理などを分離して、他のプログラムでも使える共有ライブラリというファイルが作れます。
実行時にリンクする共有ライブラリのことを動的ライブラリといいます。 Windowsの場合は.dll、Linuxの場合は.soといった拡張子をつけるのが一般的です。
動的ライブラリの作成手順は以下です。
Windows環境(DLL)の作成から実行までの例を見ていきます。
まずは以下のように「Hello World!!」と表示するhello.cを作成します。
// hello.c #include "Hello.h" void showHello() { printf("Hello World!!\n"); }
続いてそのヘッダファイルのhello.hを作成します。
#ifndef HELLO_H #define HELLO_H // ヘッダファイル #include <stdio.h> // 関数のプロトタイプ void showHello(); #endif
gccのcオプションを指定してコンパイルし、共有ライブラリ用のオブジェクトファイルを作成します。
gcc -c hello.c
※hello.oが作成されていることを確認します。
オブジェクトファイル(hello.o)と標準ライブラリなどを-sharedを指定してリンクして、共有ライブラリ(DLL)を作成します。
gcc hello.o -o hello.dll -shared
※hello.dllが作成されていることを確認します。
DLLの関数を呼び出すmain.cを作成します。
#include "Hello.h" int main(void) { showHello(); }
main.cをgccのcオプションを指定してコンパイルします。
gcc -c main.c
DLLを指定して実行形式ファイルを作成します。
gcc main.o hello.dll
※a.exeが作成されます。
作成したa.exeを実行するとHello World!!と表示されます。
a.exe Hello World!!
※同じディレクトリにhello.dllがない場合実行できません。
gccには上記に上げた以外にもオプションがあります。
-lws2_32は静的ライブラリのlibws2_32.aをリンクするためのオプションです。 コンパイルとリンクを分ける場合はリンク時に-lws2_32オプションを指定します。
コマンドの例です。
gcc sample1.c gcc sample2.c gcc sample1.o sample2.o -o sample.exe -lws2_32
gccのリンク時に「Undefined Reference to `WSAStartup@'」というエラーが出力された場合は-lws2_32オプションが指定されているか確認しましょう。
gccのリンク時に「undefined reference to `socket@12'」というエラーが出力された場合は-lws2_32オプションが指定されているか確認しましょう。
Windowsでも使えるフリーソフトのgccコンパイラで学ぶC言語入門用のオリジナルテキストをまとめています。
プログラミング作法などプログラミングについてまとめています。Python、C言語、流れ図などプログラミングのオリジナル入門テキスト問形でまとめています。
Copyright (C) 2010-2023 情報処理のWeb教科書. All Rights Reserved. Loarding…