libpqを使用するプログラムの構築(つまり、コンパイルとリンク)を行うためには、以下をすべて実施する必要があります。
libpq-fe.h
ヘッダファイルをインクルードします。
#include <libpq-fe.h>
これを忘れると、通常コンパイラから以下のようなエラーメッセージが発生します。
foo.c: In function `main': foo.c:34: `PGconn' undeclared (first use in this function) foo.c:35: `PGresult' undeclared (first use in this function) foo.c:54: `CONNECTION_BAD' undeclared (first use in this function) foo.c:68: `PGRES_COMMAND_OK' undeclared (first use in this function) foo.c:95: `PGRES_TUPLES_OK' undeclared (first use in this function)
コンパイラに-I
オプションを付与することで、コンパイラにPostgreSQLヘッダファイルをインストールしたディレクトリを通知します。
(デフォルトでこのディレクトリを検索するコンパイラもあります。
その場合はこのオプションを省くことができます。)
例えば、以下のようなコンパイルコマンドになります。
directory
cc -c -I/usr/local/pgsql/include testprog.c
Makefileを使用しているのであれば、CPPFLAGS
変数にこのオプションを追加してください。
CPPFLAGS += -I/usr/local/pgsql/include
他のユーザがそのプログラムをコンパイルする可能性がある場合は、上のようにディレクトリの場所を直接書き込むべきではありません。
その代わりにpg_config
ユーティリティを実行して、各システムにおけるヘッダファイルの在処を検索させることができます。
$
pg_config --includedir/usr/local/include
もしも、pkg-config
がインストールされている場合、代わりとして以下を実行します。
$
pkg-config --cflags libpq-I/usr/local/include
これは既にパスの最前部で-I
が含まれていることに注意してください。
正確なオプションを指定できなかった結果、コンパイラは以下のようなエラーメッセージを生成します。
testlibpq.c:8:22: libpq-fe.h: No such file or directory
最終的なプログラムのリンク時、-lpq
オプションを指定して、libpqライブラリを組み込んでください。
同時に-L
オプションを指定して、コンパイラにlibpqライブラリの在処を通知してください。
(繰り返しますが、コンパイラはデフォルトでいくつかのディレクトリを検索します。)
移植性を最大にするために、directory
-lpq
オプションの前に-L
を記述してください。
以下に例を示します。
cc -o testprog testprog1.o testprog2.o -L/usr/local/pgsql/lib -lpq
同様にpg_config
を使用してライブラリのあるディレクトリを見つけることもできます。
$
pg_config --libdir/usr/local/pgsql/lib
さもなくば、この場合もやはりpkg-config
を使用します。
$
pkg-config --libs libpq-L/usr/local/pgsql/lib -lpq
重ねて、これはパスのみならず全てのオプションを表示することに注意してください。
この部分で問題があった場合のエラーメッセージは以下のようなものになります。
testlibpq.o: In function `main': testlibpq.o(.text+0x60): undefined reference to `PQsetdbLogin' testlibpq.o(.text+0x71): undefined reference to `PQstatus' testlibpq.o(.text+0xa4): undefined reference to `PQerrorMessage'
これは-lpq
の付け忘れを示します。
/usr/bin/ld: cannot find -lpq
これは-L
の付け忘れ、あるいは、ディレクトリ指定の間違いを示します。