---
title:  C++ Application Development Walkthrough
---

This section describes how to set up a native client development environment using C++ and CMake.

## <a id="prerequisites_cpp"></a>Prerequisites
This walkthrough assumes that certain components are in place:

- The **<%=vars.product_name%> Native Client libraries**. Install the Native Client as described in
  [Getting Started with the Native Client](getting-started-nc-client.html). Follow the ease-of-use
  recommendations by installing the Native Client in a well-known location and renaming it.

| System | Native Client Library Well-Known Location |
|-----|-----|
| Linux | /usr/local/nativeclient |
| Windows | C:\Program Files\nativeclient |


- The **CMake** tool suite. Download and install CMake, following the instructions on [cmake.org] (https://cmake.org).

- **Geode**: Install and configure Geode. See the [_Geode User's Guide_](http://geode.apache.org/docs/) for instructions and system requirements.

To develop a Native Client application using C++ and CMake:

  - Create a project directory structure
  - Populate the project directories with C++ source code
  - Configure the CMake build environment
  - Run CMake to build your application
  - Run your application

## <a id="setting_up_dirs_cpp"></a>Setting up Directories and Sources

1. Create a project directory structure. In this example, the project is called MyProject. The
directory structure provides a place for your application source files and a `cmake` modules
directory for project-specific CMake files:

    ```
    MyProject/
      cmake/
        Find<%=vars.product_name%>Native.cmake
      CMakeLists.txt
      main.cpp
    ```

1. Change directory to MyProject and create your application sources. In this example, we have one
source file, `main.cpp`.

## <a id="configuring_cmake_cpp"></a>Configuring CMake

1. Copy the `Find<%=vars.product_name%>Native.cmake` script from one of the Native Client examples to the `cmake` subdirectory.

1. Create CMakeLists.txt. Copy the file from an example, if you like, as a starting point. The CMakeLists.txt file
should contain the following CMake instructions:

  - CMake minimum version

    ```
    cmake_minimum_required(VERSION 3.10)
    ```

  - Your project name and language

    ```
    project(MyProject LANGUAGES CXX)
    ```

  - Minimum language version. For the Native Client, the minimum C++ version is 11.

    ```
    set(CMAKE_CXX_STANDARD 11)
    ```

  - Path to the CMake modules directory where the `Find<%=vars.product_name%>Native.cmake` script is located and an instruction
    telling CMake to use it:

    ```
    set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
    find_package(<%=vars.product_name%>Native REQUIRED COMPONENTS cpp)
    ```

  - The compilation target and the source(s) to be compiled

    ```
    add_executable(MyProject main.cpp)

    target_link_libraries(MyProject
      PUBLIC
        <%=vars.product_name%>Native::cpp)
    ```

Combined, the above elements comprise the following CMakeLists.txt:

```
# CMakeLists.txt for C++ Native Client App
cmake_minimum_required(VERSION 3.10)

project(MyProject LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

find_package(<%=vars.product_name%>Native REQUIRED COMPONENTS cpp)

add_executable(MyProject main.cpp)

target_link_libraries(MyProject
  PUBLIC
    <%=vars.product_name%>Native::cpp)
```

## <a id="building_the_app_cpp"></a>Building the App

1. Create a build directory and set it as your current directory:

    ```
    $ mkdir build
    $ cd build
    ```

1. Run CMake twice, once to configure the build, then again to perform the build, generating the executable application.

    ```
    $ cmake ..
    $ cmake --build .
    ```

This creates the executable application in your build directory.

