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

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

Posted at October 27,2016 12:03 AM
Tag:[Linux]

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

1.はじめに

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

  • 共有(シェアード)ライブラリ、またはダイナミックリンクライブラリ(DLL)
  • 静的(スタティック)ライブラリ

それぞれのライブラリのリンク方法も次の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
関連記事
zenback
人気エントリー
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)