Skip to content

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)
    
  • 通过向编译器提供 -I目录 选项,将编译器指向安装 PostgreSQL 头文件所在的目录。(在某些情况下,编译器会默认查看相关目录,因此您可以省略此选项。)例如,您的编译命令行可能如下所示

    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 库,以及选项 -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 选项或未指定正确的目录。