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を流してとりあえず環境構築完了??
次はサンプルプログラム。