共有ライブラリの作成とライブラリ検索PATHについて
Ubuntu特有の作法でハマったのでメモ まずは、ライブラリの作成
hello.h
#ifndef HELLO_H
#define HELLO_H
void sayHello();
#endif
hello.c
#include
#include"hello.h"
void sayHello(){
printf("Hello!!\n");
}
そして、共有ライブラリ作成。ここでは、ヘッダーファイルは、${HOME}/include/に置いておく。 出力するライブラリ名には、バージョンも含めた名前にしてみた。
gcc -I ${HOME}/include/ -fPIC -shared hello.c -o ${HOME}/lib/libhello.so.1そして、${HOME}/lib/にて、シンボリックリンクを作成。新しいバージョンができたらこのリンクを作り替える。
ln -s libhello.so.1 libhello.soさらにライブラリを使う側を実装。
use.c
#include"hello.h"そして、コンパイル。
int main(){
sayHello();
return 0;
}
gcc -I ${HOME}/include -L${HOME}/lib -lhello use.c-lで、「libhello.so」のlibと拡張子を除いたものを指定。-LでそのライブラリのPATHを指定する。
そして、コンパイルが通り喜び勇んであせって
./a.outなどど実行すると。
と叱られる。ライブラリの検索PATHに${HOME}/libが無いためである。ここで普通は、LD_LIBRARY_PATHに${HOME}/libを追加するのだが、Ubuntuでは、ldconfigを使うらしい。
./a.out: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory
/etc/ld.so.conf.d/内に自分用の設定ファイルを適当な名前で作成してライブラリがあるPATHを記入する。
/etc/ld.so.conf.d/libmy.conf
そして、設定を反映させるために
/home/hoge/lib
sudo ldconfigすると無事ライブラリを使用したプログラムを実行できる
./a.outまた、リンクするライブラリを確認するには、
ldd a.out