概要
- コンパイル:
gcc
、clang
- インストール自動化:
autoconf
、automake
コンパイル
- ソースコードを機械語に変換
- ソースファイルから実行ファイルを作成
- C言語では実行時にソースファイルを用いない
コンパイラ
- 下記の作業を一気に行う
- (狭義)コンパイル
- アセンブル
- リンク
- 実行ファイルができる
- C言語の主なコンパイラ: GCCやClang
GNUコンパイラコレクション (GCC)
gcc
コマンド
Clang
- GCCの代替を目指したもの
clang
コマンド
コンパイラをインストール
# 例: CentOS8
dnf install gcc clang
ソースファイル
- 拡張子
.c
hello.c
#include <stdio.h>
int main() {
puts("Hello, C言語!");
return 0;
}
以降、hello.cのある専用のディレクトリを前提に、
gcc
コマンドでコンパイル
-o
: 実行ファイル名を指定- デフォルト
a.out
- デフォルト
gcc -o hello-c hello.c
実行
./hello-c
Hello, C言語!
コンパイルの途中過程
- (狭義)コンパイル
- アセンブリコード生成
- アセンブル
- オブジェクトコード生成
- リンク
- 実行ファイル生成
(狭義)コンパイル: gcc -S
- アセンブリコード生成
- 拡張子
.s
: アセンブリソース、テキストファイル
gcc -S hello.c
hello.s
.file "hello.c"
.text
.section .rodata
.LC0:
.string "Hello, C\350\250\200\350\252\236!"
(中略)
- 機械語の命令一つ一つを人間が理解できるように記述したもの
- CPUへの直接的な命令を操作できるが、面倒
- だから高級言語(プログラミング言語)を使う
アセンブル: gcc -c
- オブジェクトコード生成
- 拡張子
.o
: 機械語(リンク前)、バイナリファイル
gcc -c hello.s
# ファイルタイプ: バイナリファイル
file hello.o
hello.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
リンク
- ライブラリにリンクして実行できるように
puts
関数など
gcc -o hello-c hello.o
file hello-c
hello-c: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), \
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, \
for GNU/Linux 3.2.0, \
BuildID[sha1]=2705b36e171235b3940097f2eb7aa909fa9f41fd, not stripped
ライブラリ確認: ldd
コマンド
ldd hello-c
linux-vdso.so.1 (0x00007ffedbdf5000)
libc.so.6 => /lib64/libc.so.6 (0x00007f443e92a000)
/lib64/ld-linux-x86-64.so.2 (0x00007f443eced000)
puts
関数は/lib64/libc.so.6
に含まれる
clang
コマンドでコンパイル
-o
: 実行ファイル名を指定- デフォルト
a.out
- デフォルト
clang -o hello-c hello.c
ソースからインストールとは
- C言語(等)で作られたオープンソースでよく用いる
git clone
やダウンロード・解凍で入手
- 配布物のソースをコンパイルしてインストール
- パッケージマネージャ(
yum
など)を用いない
- パッケージマネージャ(
GNU Autotoolsにより自動化されたもの
Makefile
- インストール手順が定義されたテキストファイル
- その前段階のもの:
Makefile.in
- 配布物ルートのディレクトリにある
インストールのコマンド
- 以下のコマンドを順に行う
./configure
(シェルスクリプト)Makefile
を生成、依存を確認
make
- コンパイル (ビルドとも言う)
make install
- 実行ファイルやドキュメントなどを各所にコピー
# インストールまで一気に
./configure && make && make install
アンインストール
make uninstall
./configure
のオプション
--help
: ヘルプ--prefix
: インストール先変更
GNU Autotools: インストール自動化
- インストール自動化に必要な構成を自動生成するツール群
- 配布物TARファイルの作成もできる
configire
スクリプトやMakefile.in
を生成- コマンド:
autoconf
、automake
インストール
# 例: CentOS8
dnf install autoconf automake
用意するファイル
hello.c
configure.ac
Makefile.am
configure.ac
マクロ
やマクロ(引数)
のように記述#
でコメント
AC_INIT([hello-c], [1.0.1]) # パッケージ名、バージョン
AM_INIT_AUTOMAKE # automake初期化
AC_PROG_CC # コンパイラ
# Makefile作成
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
Makefile.am
変数 = 値
のように記述
# foreign: GNUパッケージとしての厳格レベル
AUTOMAKE_OPTIONS = foreign # NEWSやAUTHORSなど不要とする
bin_PROGRAMS = hello-c # 実行ファイル名
hello_c_SOURCES = hello.c # そのソース(変数名ではアンダースコアに)
aclocal
コマンド: aclocal.m4
生成
automake
パッケージに所属- 必要なマクロが定義される
autoconf
コマンド: configure
生成
configure.ac
を元に
automake
コマンド: Makefile.in
生成
Makefile.am
を元に--add-missing
: 必要なファイルを自動で
コマンドまとめ
aclocal
autoconf
automake --add-missing
コマンド後のファイル構成
Makefile.am autom4te.cache configure.ac install-sh
Makefile.in compile depcomp missing
aclocal.m4 configure hello.c
TARファイル生成
./configure
make dist
hello-c-1.0.1.tar.gz
ができる
エンドユーザが「ソースからインストール」できる
解凍後のディレクトリで、
# $HOME/local/にインストール
./configure --prefix=$HOME/local && make && make install