はじめに
ライブラリの中には,未定義の関数が存在する場合があります.
例えばNewlibでは,システムコールに相当する部分 (_sbrk()
など) がライブラリ上で定義されていません.
開発者がこのようなライブラリを使用する場合,未定義の関数は開発者自身が実装しなければなりません.
初歩的な話題ですが,この辺りの話を整理するために,実際に未定義の関数を含んだライブラリを作ってみました.
ライブラリの実装
以下のようなライブラリを実装しました.
- hoge.c
#include <stdio.h> #include "hoge.h" #include "_huga.h" void printHoge() { printHuga(); puts("hoge"); }
- hoge.h
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
正常に実行できているのが確認できました.
終わりに
(少なくとも静的ライブラリでは) ライブラリに未定義関数を含められることが,実装を通して確かめられました.