制作libpq程序

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 31. libpq - C 库 | 下一页

# 31.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`directory``选项。(有些时候编译器会查找缺省的目录， 因此你可以忽略这些选项。) 比如，你的编译命令行看起来像：

      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`directory``以告诉编译器 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`了或没有指定正确的目录。

上一页 | 起始页 | 下一页
在多线程程序里的行为 | 上一级 | 例子程序