2025年9月25日: PostgreSQL 18 发布!
支持的版本:当前18)/ 17 / 16 / 15 / 14 / 13
开发版本:devel
不受支持的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2

32.22. 构建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
    

    如果您正在使用makefiles,请将该选项添加到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选项,或者没有指定正确的目录。

提交更正

如果您在文档中看到任何不正确的内容、与您在使用特定功能时的体验不符或需要进一步澄清的内容,请使用此表格报告文档问题。