不確定特異点

広く深く、ところどころ超深く

静的ライブラリの作り方

例えば、次のような util.c と util.h をライブラリ化して外部のプログラムから利用することを想定します。

util.c
#include <stdlib.h>

/* 配列の平均値を返す */
double mean(double a[], size_t n)
{
    int i;
    double s = 0;
    
    for (i = 0; i < n; i++)
        s += a[i];
    return s / n;
}
util.h
double mean(double a[], size_t n);

これをコンパイルして、オブジェクトファイルを作成します。

$ gcc -c util.c

続いてオブジェクトファイルを ar コマンドでまとめてライブラリ化します。

$ ar rcs libutil.a util.o

オプションの意味ですが、

  • r はアーカイブ(.a ライブラリ)に指定したオブジェクトファイルを追加する。
  • c は新規にアーカイブ作成する。
  • s はアーカイブ内にオブジェクトファイルのインデックスを作成する。(ar を実行してできたアーカイブに対して、必要な ranlib コマンドの実行は不要になる)

ライブラリの使い方

利用例は次のような感じ。

#include <stdio.h>
#include "util.h"

int main()
{
    double a[] = {1.0, 2.0};
    double m = mean(a, 2); /* util ライブラリを使用 */

    printf("%f\n", m);

    return 0;
}

これをコンパイルするときに先ほどの libutil.a を一緒にリンクします。

$ gcc main.c -L. -lutil

※このとき、-static オプションを与えると Mac OS XGCC では「ld: library not found for -lcrt0.o」というエラーが出てしましました。(Linux では問題ないようです。)

実行結果

$ ./a.out
1.500000

しばらくぶりなので、備忘録をかねて書いてみました。