©
本文档使用
php.cn手册 发布
要制作(也就是说编译和链接)你的libpq程序,你需要做下面的一些事情: things:
包含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头文件的安装位置,方法是给你的编译器 提供-Idirectory选项。(有些时候编译器会查找缺省的目录, 因此你可以忽略这些选项。) 比如,你的命令行看起来象∶
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
如果没能给编译器提供正确的选项将产生类似下面这样的错误信息
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
指向这类问题的错误信息会是类似下面这个样子。
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'
This means you forgot-lpq.
/usr/bin/ld: cannot find -lpq
这意味着你忘记-L了或没有指定正确的目录。