To build (i.e., compile and link) a program using libpq you need to do all of the following
things:

Include the libpq-fe.h header
file:

#include <libpq-fe.h>

If you failed to do that then you will normally get error
messages from your compiler similar to:

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)

Point your compiler to the directory where the
PostgreSQL header files were
installed, by supplying the -Idirectory option to your compiler.
(In some cases the compiler will look into the directory in
question by default, so you can omit this option.) For
instance, your compile command line could look like:

cc -c -I/usr/local/pgsql/include testprog.c

If you are using makefiles then add the option to the
CPPFLAGS variable:

CPPFLAGS += -I/usr/local/pgsql/include

If there is any chance that your program might be compiled
by other users then you should not hardcode the directory
location like that. Instead, you can run the utility
pg_config to find out where the header files are on the
local system:

$ pg_config --includedir
/usr/local/include

Failure to specify the correct option to the compiler will
result in an error message such as:

testlibpq.c:8:22: libpq-fe.h: No such file or directory

When linking the final program, specify the option
-lpq so that the libpq library gets pulled in, as well as
the option -Ldirectory to point the compiler to
the directory where the libpq library resides. (Again, the
compiler will search some directories by default.) For
maximum portability, put the -L
option before the -lpq option. For
example:

cc -o testprog testprog1.o testprog2.o -L/usr/local/pgsql/lib -lpq

You can find out the library directory using pg_config as well:

$ pg_config --libdir
/usr/local/pgsql/lib

Error messages that point to problems in this area could
look like the following: