# A Simple C++/CMake Example¶

Building a C++ SimpleITK application is supported by using CMake to configure the build process. CMake can generate project buildsystems for Unix Makefiles, Ninja, Microsoft Visual Studio, or Mac OS Xcode.

Here is a basic CMakeLists.txt configuration file for building a SimpleITK C++ example program.

cmake_minimum_required(VERSION 3.16.3)

project(sitk_example)

find_package(SimpleITK)
add_executable ( sitk_example sitk_example.cxx )
target_link_libraries ( sitk_example \${SimpleITK_LIBRARIES} )


Here is our SimpleITK C++ example file sitk_example.cxx.

// This one header will include all SimpleITK filters and external objects.
#include <SimpleITK.h>
#include <sitkImageOperators.h>

// create convenient namespace alias
namespace sitk = itk::simple;

int main ( int argc, char* argv[] ) {

sitk::PixelIDValueEnum pixelType = sitk::sitkUInt8;
std::vector<unsigned int> imageSize ( 2, 128 );

// Create a black image
sitk::Image image( imageSize, pixelType );

// Add a Gaussian blob to the image
std::vector<double> blobSize ( 2, 64.0 );
std::vector<double> blobCenter ( 2, 64.0 );
image = image + sitk::GaussianSource( pixelType, imageSize, blobSize, blobCenter );

// Write the image as a PNG file
sitk::WriteImage(image, "blob.png" );

}


Invoking cmake as below in the same directory as these files will create the project buildsystem:

cmake .


## Required CMake Variables¶

Running CMake will produce a CMakeCache.txt file that is the CMake configuration. Within that text file there are two variables needed to build a SimpleITK program, SimpleITK_DIR and ITK_DIR. SimpleITK_DIR needs to be set to the directory that contains the file SimpleITKConfig.cmake, and ITK_DIR needs to be the directory containing the file ITKConfig.cmake.

CMake attempts to find these files automatically, but it is unlikely to find them unless SimpleITK and ITK are installed into the system.

If SimpleITK has been built using the SuperBuild process, as described in Building SimpleITK, then these required directories can be found in the SuperBuild location. The SimpleITK_DIR variable should refer to the directory SimpleITK-build within the SuperBuild location, and the ITK_DIR variable should refer to the directory ITK-build in the SuperBuild location.

Here are what the settings in a CMakeCache.txt file should look like:

//The directory containing a CMake configuration file for ITK.
ITK_DIR:PATH=path_to_simpleitk_build_dir/ITK-build

//The directory containing a CMake configuration file for SimpleITK.
SimpleITK_DIR:PATH=path_to_simpleitk_build_dir/SimpleITK-build


## Compiling using CMake¶

A SimpleITK program can also be compiled by running CMake. Here is the command to perform the build in the current directory:

cmake --build . --config Release


The ‘config’ parameter could also be set to Debug, RelWithDebInfo or MinSizeRel. On Unix-type systems Release is the default. On Windows the config must be specified explicitly. We recommend Release or MinSizeRel, since SimpleITK compiled in Debug mode is several orders of magnitude slower.

Of course traditional methods can be used to build a SimpleITK program (e.g. make on Unix, or Visual Studio on Windows), but it is often convenient to be able to use the same build command on all system types.

## Using CMake-gui on Windows¶

In addition to the standard command-line CMake, a graphical-user-interface (GUI) version of CMake is also available. Here is what the CMake GUI looks like building our same example:

We have placed the files sitk_example.cxx and CMakeLists.txt in the folder C:\sitkExample, and in CMake we have set the source directory to point there. Also, in CMake, we have set the build directory to point to C:\sitkExample-Build.

After the user specifies the source and build directories, CMake will ask to select which compiler generator to use. The options are determined by what versions of Visual Studio are installed on the system, in this example Visual Studio 16 2019. The user must specify x64 for the platform generator, as the default option (x86) is not supported by SimpleITK.

After clicking Configure, CMake will attempt to find the SimpleITK library. That can be set in the SimpleITK_DIR variable, as seen in the above left image. CMake is looking for the directory containing the SimpleITKConfig.cmake file, in our example C:\SimpleITK-build\SimpleITK-build.

Clicking Configure again, CMake will then try to find the ITK library for the ITK_DIR variable (see above right). CMake is looking for the directory containing ITKConfig.cmake. For a SimpleITK SuperBuild, as we have done, ITK_DIR will be the ITK-build directory within the SuperBuild, in our case C:\SimpleITK-build\ITK-build.

Once the SimpleITK_DIR and ITK_DIR variables have been set, we can click Generate to create the Visual Studio project file, ALL_BUILD.vcxproj.

After opening ALL_BUILD.vcvproj in Visual Studio, the user should select a build type in Visual Studio. We recommend choosing Release for performance reasons. Then the user should select the x64 build platform, not the unsupported default, x86. Many man-hours and cpu cycles have been wasted building SimpleITK without setting the proper platform.