hakeの日記

Windows環境でプログラミングの勉強をしています。

共有ライブラリの作成

前々から疑問に思っていたsoなファイルってどうやって作るんだろう?という疑問について調べてみました。ググったところこちらに解りやすい説明があったので実験してみる。環境は先日入れたzgcc42です。

ソースファイルは以下

----main.cpp
#include <stdio.h>
#include "add.h"

int main(){
	int a = 2;
	int b = 3;
	int c;
	c = add(a,b);
	printf("%d + %d = %d\n", a, b, c);
	return 0;
}

-----add.h

int add(int a, int b);

-----add.cpp
#include "add.h"

int add(int a, int b){
	return a + b ;
}
  • とりあえず普通にコンパイル。a.outができて実行できればおっけー
$ gcc main.cpp add.cpp
  • 次に説明に従ってadd.cppのライブラリ作成
$ gcc -fPIC -c add.cpp                        add.oができる
$ gcc -shared -Wl,-soname,libadd.so.1 -o libadd.so.1.0 add.o  libadd.so.1.0ができる
  • シンボリックリンク
    • 本当はln -sなんだけどfatな領域で実験したのでコピーする。libadd.soが利用されるかと思ったらlibadd.so.1が参照されたので、一応全部コピーしておく
$ cp libadd.so.1.0 libadd.so
$ cp libadd.so.1.0 libadd.so.1
  • main.cppのコンパイル
    • Lオプションでライブラリの所在を、lオプションでライブラリ名を、という理解で良いのか?
$ gcc -L. -ladd main.cpp
  • a.out実行、さっきと同じ結果ならおっけー
    • LD_LIBRARY_PATHにカレント(libaddの場所)を追加する必要あり
  • 一応lddで確認
    • ちゃんとlibaddが参照されてる
$ ldd a.out

	libadd.so.1 => ./libadd.so.1 (0x40022000)
	libgcc_s.so.1 => /opt/zgcc42/lib/libgcc_s.so.1 (0x4002b000)
	libc.so.6 => /lib/libc.so.6 (0x4003b000)
	/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)