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)
コンパイラに-Idirectoryオプションを付与することで、コンパイラにPostgreSQLヘッダファイルをインストールしたディレクトリを通知します。 (デフォルトでこのディレクトリを検索するコンパイラもあります。その場合はこのオプションを省くことができます。) 例えば、以下のようなコンパイルコマンドになります。
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
正確なオプションを指定できなかった結果、コンパイラは以下のようなエラーメッセージを生成します。
testlibpq.c:8:22: libpq-fe.h: No such file or directory
最終的なプログラムのリンク時、-lpqオプションを指定して、libpqライブラリを組み込んでください。 同時に-Ldirectoryオプションを指定して、コンパイラにlibpqライブラリの在処を通知してください。 (繰り返しますが、コンパイラはデフォルトでいくつかのディレクトリを検索します。) 移植性を最大にするために、-lpqオプションの前に-Lを記述してください。 以下に例を示します。
cc -o testprog testprog1.o testprog2.o -L/usr/local/pgsql/lib -lpq
同様にpg_configを使用してライブラリのあるディレクトリを見つけることもできます。
$ pg_config --libdir /usr/local/pgsql/lib
この部分で問題があった場合のエラーメッセージは以下のようなものになります。
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の付け忘れ、あるいは、ディレクトリ指定の間違いを示します。
プログラムでlibpq-int.hヘッダファイルを参照する場合やこれを使用しないようにプログラムを修正することをあきらめた場合、PostgreSQL 7.2から、このファイルはincludedir/postgresql/internal/libpq-int.hに格納されるように変更されていますので、コンパイラのコマンドラインに適切な-Iオプションを追加する必要があります。