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
- VMをundefineできない場合の対処
- cpanflute2でエラーになる場合の対処
- シェルスクリプトをバイナリ化する「shc」
- OpenSSLで文字列を暗号化・複号化する方法
- sshログインに時間がかかる場合の対処
- vi/vimで範囲指定して置換する方法
- vi/vimでマークした行に移動する方法
- vi/vimで複数行を一括削除する方法
- LinuxでOSキャッシュをクリアする方法
- lessで検索文字列だけを表示する方法
- tailコマンドでファイルがローテートされても追従する方法
- svnでファイルやディレクトリを削除する方法
- phpMyAdminで「unknown system variable 'lc_messages'」となる場合の対処
- Linux(CentOS)でapxsがみつからない場合の対処
- PHP7.3とApacheを連携させる方法