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