34.21. Сборка программ с 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)
    
  • Сообщите вашему компилятору каталог, в котором установлены заголовочные файлы PostgreSQL, передав ему параметр -Iкаталог. (В некоторых случаях компилятор сам может обращаться к нужному каталогу, так что этот параметр можно опустить.) Например, ваша команда компиляции может быть такой:

    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. (Опять же, компилятор будет просматривать определённые каталоги по умолчанию.) Для максимальной переносимости указывайте ключ -L перед параметром -lpq. Например:

    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 или не указали правильный каталог.