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