↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 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
历史版本PostgreSQL 7.3 已于 2007 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

1.13. 构建 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)
    
  • 通过给编译器提供 -Idirectory 选项,让编译器找到 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
    

    未给编译器指定正确的选项将导致类似下面的错误消息:

    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'
    

    这表示你忘记了 -lpq。

    /usr/bin/ld: cannot find -lpq
    

    这表示你忘记了 -L 或者没有指定正确的路径。

如果你的代码引用了头文件libpq-int.h,而你拒绝修改代码使其不再使用它,那么从PostgreSQL 7.2 开始,这个文件位于includedir/postgresql/internal/libpq-int.h,因此你需要在编译器命令行中加入适当的-I选项。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。