31.21. Создание программ с использованием libpq#

31.21. Создание программ с использованием libpq

31.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)
    

  • Укажите компилятору путь к каталогу, в котором установлены заголовочные файлы Tantor BE, указав опцию -Idirectory. (В некоторых случаях компилятор будет искать в указанном каталоге по умолчанию, поэтому вы можете опустить эту опцию). Например, ваша команда компиляции может выглядеть так:

    cc -c -I/usr/local/pgsql/include testprog.c
    

    Если вы используете make-файлы, то добавьте опцию в переменную 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 была подключена, а также опцию -Ldirectory, чтобы указать компилятору путь к каталогу, где находится библиотека 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 или не указали правильный каталог.