AMQP for PostgreSQL導入(成功の巻)

AMQP for PostgreSQL導入(失敗)の続き

前回こんなエラーが出ていたので、開発元の方に問い合わせ見ました。

FATAL:  could not load library "/usr/local/pgsql/9.0.0/lib/pg_amqp.so": /usr/local/pgsql/9
.0.0/lib/pg_amqp.so: undefined symbol: pthread_key_create

きちんとご回答頂けました。ありがとうございますm(_ _)m

Add -lpthread to the ldflags of the pg_amqp.so build process.

なんかmakeのオプションに足さないといけないようで。。。
あんまりわかっていない。。。LDFLAGS。。。ということで、Google先生〜!!

configureするときのLDFLAGSやLIBSとは をまんま引用。

アプリケーションをインストールには、configure ⇒ make ⇒ make installとすれば、
大概インストールできてしまいます。 
しかし、ときにprefixを指定してインストールしてしまうと、その後、インストールする
ソフトウェアに「ライブラリがない」と言われてインストールできないことがあります。 
そんなとき、無理矢理、ライブラリと思われるファイル(インストールしたソフトのlib配下や*.soファイル)
を/usr/libと/usr/local/libにリンクしたりコピーしたりしてインストールしてきました。 
こんないい加減なやり方で良いものなのでしょうか?(絶対良くないでしょうね!!) 
最近では、大概のソフトウェアを--enable-sharedでインストールして、LD_LIBRARY_PATHを
指定してやってます。(これも良いかどうかも分からず...) 

さて、本題ですが、これでもlibrary not foundでインストールできないソフトウェアがあります。
それで、調べたところ、configureのオプションに、LIBSやLDFLAGSがあるようですが、どういうときに
使用するものなのか、分かりません。 

どういうときに使用するものなのか?これで、library not foundは解決するものなのか?
ご教授いただけると幸いです。 
./configure --helpを見てください。 
LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a 
nonstandard directory <lib dir> 
LIBS linker flags, e.g. -l<lib>.{a,so} if you have nonstandard 
libraries to link 
とあります。 

これらの変数は最終的にMakefileで 
$(CC) $(LD_FLAGS) -o taget $(LIBS) 
のように使われます。 
ですからgccに与えるオプションをそのままわたせばいいと思います。 

一般的な使い方としては, 
ライブラリのある位置をLD_FLAGSで指定して, 
特別にライブラリを追加してリンクする時はLIBSを指定すればいいのではないでしょうか? 
(ただ、LIBSを指定するのがどんな時なのかちょっと想像できませんね) 

以下のようにすれば/home/hoge/lib以下のライブラリも検索するようになります。 
LD_FLAGS="-L/home/hoge/lib" ./configure 

#私はめんどくさいのでMakefileを書き換える派です←ダメ
つまり、こう理解しても良いものなのでしょうか? 

コンパイルするときに、./configureの前置として、"LIBS -l<ライブラリファイル>"や
"LDFLAGS -L<ライブラリファイルのあるディレクトリ>"を付けると、通常ライブラリがあるはずの
/usr/libや/usr/local/libではない/home配下などにあるライブラリを見てくれる。 

ちなみに、LD_LIBRARY_PATHも./configure時に見てくれるようですが、環境変数ですから
/homeのような場所にあるライブラリの指定には、LIBSやLDFLAGSを使う方が良いのでしょうか? 

プログラムの経験がほとんどない私には、Makefileをいじるのは少し怖いですね。
コンパイルするときに、./configureの前置として、"LIBS -l<ライブラリファイル>"や
"LDFLAGS -L<ライブラリファイルのあるディレクトリ>"を付けると、通常ライブラリがあるはずの
/usr/libや/usr/local/libではない/home配下などにあるライブラリを見てくれる。

staticにリンクする場合はそれでいいと思います。 

--enable-sharedは使った経験がないのでその場合はちょっと分かりません。 
ただ、標準的ではない場所にprefixを指定したときには 
LD_LIBRARY_PATHで指定するほかないような気がしますね。 

ちなみにLD_LIBRARY_PATHは実行時に動的リンクを解決するために 
使用されます。ld.so(8)参照。 ですからconfigure時に指定しなくても 実行時に指定されていれば
OKのはずです。 

#makefileをいじるのはコードを読むのと比べたら大変じゃないですよ。 
#ビルドのエラーはたいてい対処できますし…

なるほど。。。
ということで、makeの際にオプションを追加。ほんとはMakeFileいじるほうが良いのか?
そもそも必要なものがきっと見つけられないし、まだ、理解できていないけど、教えて頂いた通り、
やってみる。

make USE_PGXS=1 LDFLAGS=-lpthread

あとは、make install して再起動。

プロセス見ると立ち上がってるじゃん!!
ログ見ても、

LOG:  loaded library "pg_amqp.so"

おぉーやったー!!あとは、pg_amqp.sqlを流してとりあえず環境構築完了??

次はサンプルプログラム。