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