30.18. libpqプログラムの構築

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の付け忘れ、あるいは、ディレクトリ指定の間違いを示します。