1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>32.22. Building libpq Programs</title><link rel="stylesheet" type="text/css" href="stylesheet.css" /><link rev="made" href="pgsql-docs@lists.postgresql.org" /><meta name="generator" content="DocBook XSL Stylesheets Vsnapshot" /><link rel="prev" href="libpq-threading.html" title="32.21. Behavior in Threaded Programs" /><link rel="next" href="libpq-example.html" title="32.23. Example Programs" /></head><body id="docContent" class="container-fluid col-10"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="5" align="center">32.22. Building <span class="application">libpq</span> Programs</th></tr><tr><td width="10%" align="left"><a accesskey="p" href="libpq-threading.html" title="32.21. Behavior in Threaded Programs">Prev</a> </td><td width="10%" align="left"><a accesskey="u" href="libpq.html" title="Chapter 32. libpq — C Library">Up</a></td><th width="60%" align="center">Chapter 32. <span class="application">libpq</span> — C Library</th><td width="10%" align="right"><a accesskey="h" href="index.html" title="PostgreSQL 18.0 Documentation">Home</a></td><td width="10%" align="right"> <a accesskey="n" href="libpq-example.html" title="32.23. Example Programs">Next</a></td></tr></table><hr /></div><div class="sect1" id="LIBPQ-BUILD"><div class="titlepage"><div><div><h2 class="title" style="clear: both">32.22. Building <span class="application">libpq</span> Programs <a href="#LIBPQ-BUILD" class="id_link">#</a></h2></div></div></div><a id="id-1.7.3.29.2" class="indexterm"></a><p>
3 To build (i.e., compile and link) a program using
4 <span class="application">libpq</span> you need to do all of the following
7 </p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>
8 Include the <code class="filename">libpq-fe.h</code> header file:
9 </p><pre class="programlisting">
10 #include <libpq-fe.h>
12 If you failed to do that then you will normally get error messages
13 from your compiler similar to:
14 </p><pre class="screen">
15 foo.c: In function `main':
16 foo.c:34: `PGconn' undeclared (first use in this function)
17 foo.c:35: `PGresult' undeclared (first use in this function)
18 foo.c:54: `CONNECTION_BAD' undeclared (first use in this function)
19 foo.c:68: `PGRES_COMMAND_OK' undeclared (first use in this function)
20 foo.c:95: `PGRES_TUPLES_OK' undeclared (first use in this function)
22 </p></li><li class="listitem"><p>
23 Point your compiler to the directory where the <span class="productname">PostgreSQL</span> header
24 files were installed, by supplying the
25 <code class="literal">-I<em class="replaceable"><code>directory</code></em></code> option
26 to your compiler. (In some cases the compiler will look into
27 the directory in question by default, so you can omit this
28 option.) For instance, your compile command line could look
30 </p><pre class="programlisting">
31 cc -c -I/usr/local/pgsql/include testprog.c
33 If you are using makefiles then add the option to the
34 <code class="varname">CPPFLAGS</code> variable:
35 </p><pre class="programlisting">
36 CPPFLAGS += -I/usr/local/pgsql/include
39 If there is any chance that your program might be compiled by
40 other users then you should not hardcode the directory location
41 like that. Instead, you can run the utility
42 <code class="command">pg_config</code><a id="id-1.7.3.29.3.2.2.2.2" class="indexterm"></a> to find out where the header
43 files are on the local system:
44 </p><pre class="screen">
45 <code class="prompt">$</code> pg_config --includedir
46 <code class="computeroutput">/usr/local/include</code>
50 have <code class="command">pkg-config</code><a id="id-1.7.3.29.3.2.2.3.2" class="indexterm"></a> installed, you can run instead:
51 </p><pre class="screen">
52 <code class="prompt">$</code> pkg-config --cflags libpq
53 <code class="computeroutput">-I/usr/local/include</code>
55 Note that this will already include the <code class="option">-I</code> in front of
58 Failure to specify the correct option to the compiler will
59 result in an error message such as:
60 </p><pre class="screen">
61 testlibpq.c:8:22: libpq-fe.h: No such file or directory
63 </p></li><li class="listitem"><p>
64 When linking the final program, specify the option
65 <code class="literal">-lpq</code> so that the <span class="application">libpq</span>
66 library gets pulled in, as well as the option
67 <code class="literal">-L<em class="replaceable"><code>directory</code></em></code> to point
68 the compiler to the directory where the
69 <span class="application">libpq</span> library resides. (Again, the
70 compiler will search some directories by default.) For maximum
71 portability, put the <code class="option">-L</code> option before the
72 <code class="option">-lpq</code> option. For example:
73 </p><pre class="programlisting">
74 cc -o testprog testprog1.o testprog2.o -L/usr/local/pgsql/lib -lpq
77 You can find out the library directory using
78 <code class="command">pg_config</code> as well:
79 </p><pre class="screen">
80 <code class="prompt">$</code> pg_config --libdir
81 <code class="computeroutput">/usr/local/pgsql/lib</code>
84 Or again use <code class="command">pkg-config</code>:
85 </p><pre class="screen">
86 <code class="prompt">$</code> pkg-config --libs libpq
87 <code class="computeroutput">-L/usr/local/pgsql/lib -lpq</code>
89 Note again that this prints the full options, not only the path.
91 Error messages that point to problems in this area could look like
93 </p><pre class="screen">
94 testlibpq.o: In function `main':
95 testlibpq.o(.text+0x60): undefined reference to `PQsetdbLogin'
96 testlibpq.o(.text+0x71): undefined reference to `PQstatus'
97 testlibpq.o(.text+0xa4): undefined reference to `PQerrorMessage'
99 This means you forgot <code class="option">-lpq</code>.
100 </p><pre class="screen">
101 /usr/bin/ld: cannot find -lpq
103 This means you forgot the <code class="option">-L</code> option or did not
104 specify the right directory.
105 </p></li></ul></div><p>
106 </p></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="libpq-threading.html" title="32.21. Behavior in Threaded Programs">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="libpq.html" title="Chapter 32. libpq — C Library">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="libpq-example.html" title="32.23. Example Programs">Next</a></td></tr><tr><td width="40%" align="left" valign="top">32.21. Behavior in Threaded Programs </td><td width="20%" align="center"><a accesskey="h" href="index.html" title="PostgreSQL 18.0 Documentation">Home</a></td><td width="40%" align="right" valign="top"> 32.23. Example Programs</td></tr></table></div></body></html>