satumaimoの備忘録

個人的なメモ中心

【C言語】静的ライブラリに未定義関数を含める

はじめに

ライブラリの中には,未定義の関数が存在する場合があります.

例えばNewlibでは,システムコールに相当する部分 (_sbrk()など) がライブラリ上で定義されていません.

開発者がこのようなライブラリを使用する場合,未定義の関数は開発者自身が実装しなければなりません.

初歩的な話題ですが,この辺りの話を整理するために,実際に未定義の関数を含んだライブラリを作ってみました.

ライブラリの実装

以下のようなライブラリを実装しました.

#include <stdio.h>
#include "hoge.h"
#include "_huga.h"

void printHoge()
{
  printHuga();
  puts("hoge");
}
void printHoge();
  • _huga.h
void printHuga();

上記のプログラムをコンパイルし,arコマンドで静的ライブラリにします.

$ gcc -c hoge.c
ar rcs libhoge.a hoge.o

以上でライブラリは完成です.

ライブラリの使用

作成したライブラリを実際に使ってみます.

まずは,未定義関数を定義せずにライブラリの使用を試みます.

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

int main(void)
{
  printHoge();
  return 0;
}

このコードをコンパイルしてみます.

$ gcc -I. -L. -lhoge -o main main.c
/usr/bin/ld: ./libhoge.a(hoge.o): in function `printHoge':
hoge.c:(.text+0x9): undefined reference to `printHuga'
collect2: error: ld returned 1 exit status

関数printHuga()が定義されていないため,リンク時にエラーとなりました.

次に,未定義関数を定義してライブラリの実行を試みます.

  • main.c (修正版)
#include <stdio.h>
#include "hoge.h"
#include "_huga.h"

int main(void)
{
  printHoge();
  return 0;
}

void printHuga(void)
{
  puts("huga");
}

このコードをコンパイルし,実行してみます.

$ gcc -I. -L. -lhoge -o main main.c
$ ./main
huga
hoge

正常に実行できているのが確認できました.

終わりに

(少なくとも静的ライブラリでは) ライブラリに未定義関数を含められることが,実装を通して確かめられました.