Helix Core is now P4. Product user interfaces will be updated soon. Learn more >>

C/C++ API Documentation | 2025.1

# Compiling and linking P4 Server applications

The following sections tell you how to build your application on the target platform.

To build `p4api.cc`, include `clientapi.h`, which includes all the necessary header files for the sample client application.

## Additional script libraries for P4 extensions

To learn about this technology, see the P4 Server Administration Documentation.

Name | Description
--- | ---
`libp4script.a` | For the code common to server and client
`libp4script_c.a` | For the client-side
`libp4script_curl` | If you already have a copy of curl, you can skip linking to this version
`libp4script_sqlite` | If you already have a copy of SQLite, you can skip linking to this version

## Link order

The link libraries distributed with P4 API for C/C++ must be linked explicitly in the following order:

| UNIX | Windows
--- | --- | ---
1 | `libclient.a` | `libclient.lib`
2 | `librpc.a` | `librpc.lib`
3 | `libsupp.a` | `libsupp.lib`

## SSL/TLS support

P4API libraries must be linked against the OpenSSL libraries from http://www.openssl.org/.

### OpenSSL Library Version

We recommend keeping current with the latest minor version matching the version referenced in the P4 API for C/C++ file `librpc.a` (or `librpc.lib` on Windows). To see which version is referenced by the library, run the following command on UNIX variants or Macintosh:

`strings librpc.a | grep ^OpenSSL`

On Windows:

`strings librpc.lib | findstr /B OpenSSL`

This command will produce an output similar to the following:

OpenSSL 1.0.1p 9 Jul 2015

In this example, you would use the latest minor version of OpenSSL that matches version 1.0.1.

### Link order for SSL/TLS support

To enable SSL/TLS support, link with the ssl and crypto libraries from OpenSSL. This results in the following link order:

- `libclient.a`
- `librpc.a`
- `libsupp.a`
- `libssl.a`
- `libcrypto.a`

On Windows, the ssl and crypto OpenSSL libraries are named `ssleay32.lib` and `libeay32.lib` respectively.

## Compiler support

### UNIX

For all UNIX platforms, you can use the `gcc` compiler to compile client applications with the P4 API for C/C++.

Note that `clientapi.h` includes `stdhdrs.h`, which might attempt to set platform-specific defines. To ensure these defines are set properly, compile with the `-DOS_`XXX`` flag, where XXX is the platform name as specified by Perforce. (Use `p4 -V` to display the platform name; for example, for `LINUX52X86`, specify -DOS_LINUX.)

Some platforms require extra link libraries for sockets. Solaris requires the following compiler flags:

-lsocket -lnsl

### Linux

Some platforms require extra link libraries for runtime support. Linux requires the following compiler flag:

-lrt

### Windows

Using Microsoft Visual Studio (VC++), compile your client application with the following flags:

/DOS_NT /MT /DCASE_INSENSITIVE

For debugging, compile with the /MTd flag for multithreading.
Do not compile with /MD or /MDd, because these flags can cause undefined behavior.

Link with the following libraries:

- `libcmt.lib`
- `oldnames.lib`
- `kernel32.lib`
- `ws2_32.lib`
- `advapi32.lib`

## Sample Jamfile

The following example shows a Jamfile that can be used to build `p4api.cc`, a P4 Server application. (This example is in the `api` subdirectory.)

    CFLAGS = -g -D_GNU_SOURCE ;
    LINK = c ;OPTIM = ;
    Main p4api : p4api.cc ;
    ObjectHdrs p4api : api ;
    LinkLibraries p4api : api/libclient.a api/librpc.a api/libsupp.a

For more about `jam`, see Building with Jam.

## Sample Makefile

The following is a GNU `make` file for building `p4api.cc`, a P4 Server application. (The example assumes the API is installed in the `api` subdirectory.)

    SOURCES = p4api.cc
    INCLUDES = -Iapi
    OBJECTS = ${SOURCES:.cc=.o}
    LIBRARIES = api/libclient.a api/librpc.a api/libsupp.a
    BINARY = p4api
    RM = /bin/rm -f

    C = c
    CFLAGS = -c -g -D_GNU_SOURCE
    LINK = c
    LINKFLAGS =

    .cc.o :
       ${C} ${CFLAGS} $< ${INCLUDES}

    ${BINARY} : ${OBJECTS}
       ${LINK} -o ${BINARY} ${OBJECTS} ${LIBRARIES}

    clean :
       - ${RM} ${OBJECTS} ${BINARY}

Your search for returned results