Linuxで共有ライブラリsoを作ったり使ったりする方法。

昨日はMac OSXでダイナミックライブラリの作り方を書きました。

Mac OSXでダイナミックライブラリdylibを作ったり使ったりする方法。

今日は、Linux編です。

dylibexample

Linuxの場合は共有ライブラリso

Linuxだと、共有ライブラリと呼ぶようです。拡張子は、soです。

下記ブログを参考にしました。

gccを用いたCの共有ライブラリの作り方

ライブラリのコードを書く。

簡単なライブラリコードを書きます。hello関数を実行すると、hello worldを出力するだけです。

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

Mac OSXの場合と同じライブラリのコードにしました。これを、dylibexample.cと名づけて保存します。

gccでsoにコンパイルする。

Linuxの場合は、-sharedオプションをつけてコンパイルすると、soファイルが作成できます。

$ gcc -shared -fPIC -o libdylibexample.so dylibexample.c 
$ ls
dylibexample.c  libdylibexample.so

結構簡単です。

main関数からライブラリを使う。

今度はライブラリを使う側の本体の処理を書きます。メイン関数の中に、ライブラリのhello関数を呼ぶ処理を書くだけとします。

int main(){
	return hello();
}

これをコンパイルするときに、共有ライブラリlibdylibexample.soをリンクします。

$ gcc -I./ -L./ -o main main.c -ldylibexample
$ ls
dylibexample.c  libdylibexample.so  main  main.c

実行ファイルができました!

ライブラリのパスを解決してから実行する

これも先述のブログに書いてあることですが、Linuxの場合は、Mac OSXの場合と違って、ライブラリのパスを通さないと実行ファイルが動作しませんでした。

$ ./main 
./main: error while loading shared libraries: libdylibexample.so: cannot open shared object file: No such file or directory
$ ldd main
	linux-vdso.so.1 =>  (0x00007fffe55ff000)
	libdylibexample.so => not found
	libc.so.6 => /lib64/libc.so.6 (0x0000003117600000)
	/lib64/ld-linux-x86-64.so.2 (0x0000003116e00000)

根本的にライブラリのパスが通っている場所におけば良いと思いますが、今回の実行だけパスを通すなら、次のように実行すれば良いとのことです。

$ LD_LIBRARY_PATH=. ./main
hello world

メイン関数から、共有ライブラリのhello関数が呼び出され、hello worldが表示されました!

Mac OSX、Linuxときて、次はWindow編が続きます。

各プラットフォームの動的ライブラリを作るシリーズ

Mac OSXの場合: Mac OSXでダイナミックライブラリdylibを作ったり使ったりする方法。
Windowsの場合: Windowsでダイナミックリンクライブラリdllを作ったり使ったりする方法。
Visual Studioの場合: Visual Studioでダイナミックリンクライブラリdllを作ったり使ったりする方法。

About katty0324

Scroll To Top