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

    cc -c -I/var/lib/qhb/data/include testprog.c
    

    Если вы используете сборочные файлы, добавьте этот параметр в переменную CPPFLAGS:

    CPPFLAGS += -I/var/lib/qhb/data/include
    

    Если существует вероятность, что ваша программа будет компилироваться другими пользователями, вам не следует жестко задавать расположение каталога таким образом. Вместо этого вы можете выполнить утилиту pg_config, чтобы узнать, где в локальной системе находятся заголовочные файлы:

    $ pg_config --includedir
    /var/lib/qhb/data/include
    

    Если у вас установлена программа pkg-config, вместо этого вы можете выполнить:

    $ pkg-config --cflags libpq
    -I/var/lib/qhb/data/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/var/lib/qhb/data/lib -lpq
    

    Также каталог библиотеки можно найти с помощью pg_config:

    $ pg_config --libdir
    /var/lib/qhb/data/lib
    

    Или с помощью pkg-config:

    $ pkg-config --libs libpq
    -L/var/lib/qhb/data/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 или не указали правильный каталог.