[C 言語]ダイナミックリンクライブラリ(共有ライブラリ)の作成



WindowsでいうDLL、Linuxでは(Dynamic)SharedObject(SO)とも呼ばれる。

ldd コマンド

lddコマンドは実行ファイルがどのダイナミックリンクライブラリを参照(リンク)しているか調べるコマンド。
以下の例ではtestというファイルはlib.so.4をリンクしていることがわかります。

$ ldd test
    libc.so.4 => /usr/lib/libc.so.4 (0x28067000)

ライブラリの作成

まず、SharedObjectとするプログラムを書く。sayhello.cとして保存します。

 #include <stdio.h>
 
 void sayhello(void)
 {
         printf("Hello\n");
 }

gccを利用してSharedObjectとしてコンパイルします。

$ gcc -fPIC -shared sayhello.c -o libsayhello.so #libなんたら.soという名前で作成

# fileコマンドでSOであることを確認

$ file libsayhello.so
libsayhello.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (FreeBSD), not stripped

ライブラリを呼び出すプログラム

sayhello()を呼び出すプログラムをmain_hello.cとして保存します。

 #include <stdio.h>
 
 int main(void)
 {
         sayhello();
         return 0;
 }

コンパイル

$ gcc main_hello.c libsayhello.so -o hello

#lddで確認
$ ldd hello
hello:
  libsayhello.so => not found (0x0)
  libc.so.4 => /usr/lib/libc.so.4 (0x28067000)

この時点では、libsayhello.soがみつからないと言われる。
ライブラリの場所を環境変数LD_LIBRARY_PATH(ライブラリの検索パス)に加える必要がある。

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/someone/mylib/

# 実行
$ hello
Hello

※ /home/someone/mylibはlibsayhello.soのあるディレクトリを指定

参考文献

GNU Make 第3版 GNU Autoconf/Automake/Libtool ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道

参考URL

Comments are closed.