トップページへ

Linuxで共有ライブラリの作成とダイナミックリンクをする方法

小粋空間 » Linux » Linuxで共有ライブラリの作成とダイナミックリンクをする方法

Linuxで共有ライブラリの作成とダイナミックリンクをする方法を紹介します。

1.はじめに

ライブラリはリンク方法によって次の2種類に分けられます。

それぞれのライブラリのリンク方法も次の2種類に分けられます。

Linuxでは共有ライブラリを利用するのが一般的で、共有ライブラリの拡張子は.so(shared object)となっています。

ということで、Linuxで共有ライブラリの作成と、作成した共有ライブラリをダイナミックリンクで利用する方法を紹介します。

サンプルはC言語で作成します。

2.共有ライブラリ用プログラム

共有ライブラリ用プログラムとして、下記のコードを記述します。

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

ここではhello.cというファイル名で保存します。

3.共有ライブラリを使用するプログラム

共有ライブラリのhello()を使用するプログラムとして、下記のコードを記述します。

void main(){
    hello();
}

ここではmain.cというファイル名で保存します。

4.共有ライブラリの作成

2項のプログラムから共有ライブラリを作成します。

% gcc -shared -fPIC -o libhello.so hello.c

共有ライブラリは名前の先頭にlibをつける必要があります。

"-shared"が共有ライブラリの指定です。

"-fPIC"は、このオプションを付与せずに実行すると、下記のエラーが発生したので付与しています。

% gcc -shared -o libhello.so hello.c
/usr/bin/ld: /tmp/cc1BuLhc.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
/tmp/cc1BuLhc.o: could not read symbols: Bad value
collect2: ld はステータス 1 で終了しました

これで「libhello.so」という共有ライブラリができあがります。

共有ライブラリ作成のとき、次のように"-c"オプションをつけると、正しい共有ライブラリにならないようです。

% gcc -shared -fPIC -o libhello.so -c hello.c

5.プログラムのビルド

main.cをコンパイル(ビルド)します。

% gcc -I./ -L./ main.c -o main -lhello

"-L"でリンク時のライブラリパス、"-l"で使用する共有ライブラリ名を指定します。

6.共有ライブラリパスの指定

5項までで必要なファイルは出来上がりますが、この状態で実行ファイル"main"を実行すると「cannot open shared object file」というエラーに遭遇します。

% ./main 
./main: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory

これはmainで使用する共有ライブラリがみつからないためです。

よって、環境変数"LD_LIBRARY_PATH"で使用する共有ライブラリを設定する必要があります。

共有ライブラリのパスが"/home/foo/hello"であれば、

% export LD_LIBRARY_PATH=/home/foo/hello

とします。

これで実行すれば期待する結果が得られます。

% ./main                                                                                               
hello world

« 前の記事へ

次の記事へ »

トップページへ