Compiling Cantera C++ Programs¶
This guide shows you how to build C++ programs that use Cantera's features. Note: This section is about compiling applications that use the Cantera library; instructions to compile the Cantera library are over over here.
Build Systems¶
In general, it should be possible to use Cantera with any build system by specifying the necessary header and library paths, as well as the appropriate compiler and linker options. The correct options and paths depend on your system configuration and the options that were used to compile Cantera. Cantera is installed with examples and configuration data that will help with determining the correct options for some common build systems.
pkg-config¶
On systems where the pkg-config
program is installed, it can be used to
determine the correct compiler and linker flags for use with Cantera. For
example:
g++ myProgram.cpp -o myProgram $(pkg-config --cflags --libs cantera)
It can also be used to populate variables in a Makefile:
CFLAGS += $(shell pkg-config --cflags cantera)
LIBS += $(shell pkg-config --libs cantera)
Or in an SConstruct file:
env.ParseConfig("pkg-config --cflags --libs cantera")
Note that pkg-config
will work only if it can find the cantera.pc
file. If Cantera's libraries are not installed in a standard location such as
/usr/lib
or /usr/local/lib
, you may need to set the PKG_CONFIG_PATH
environment variable appropriately before using pkg-config
, for example by running:
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/path/to/lib/pkgconfig
where /path/to/lib
should be replaced by Cantera's library installation path.
pkg-config
is available through system package managers for most Linux
distributions, and can be installed using Conda or Homebrew on macOS.
SCons¶
SCons is a multi-platform, Python-based build system. It is the build system
used to compile Cantera. The description of how to build a project is contained
in a file named SConstruct
. The SConstruct
file is actually a Python
script, which makes it very straightforward to add functionality to a
SCons-based build system.
A typical SConstruct
file for compiling a program that uses Cantera might
look like this:
env = Environment()
env.Append(CCFLAGS='-g -std=c++17',
CPPPATH=['/usr/local/cantera/include'],
LIBS=['cantera_shared'],
LIBPATH=['/usr/local/cantera/lib'],
RPATH=['/usr/local/cantera/lib']
LINKFLAGS=['-g', '-pthread'])
sample = env.Program('sample', 'sample.cpp')
Default(sample)
This script establishes what SCons refers to as a "construction environment"
named env
, and sets the header (CPPPATH
) and library (LIBPATH
) paths
to include the directories containing the Cantera headers and libraries. Then,
a program named sample
is compiled using the single source file sample.cpp
.
To determine the appropriate settings for your system, take a look at one of the
pre-configured SConstruct
files that are provided with the C++ examples contained in
the samples/cxx
subdirectory of the Cantera installation directory.
To build a program using SCons, simply run the following command from a shell in the
directory containing the SConstruct
file:
scons
If you installed SCons using Conda, you may need to activate the appropriate Conda
environment so that the scons
command will be on your path. On Windows, you may
need to run this command from a shell with the appropriate Visual Studio environment
variables set. This can be done either by starting the shell using the Developer
Command Prompt for VS 20xx shortcut in the Start menu, or by running the batch file:
C:\Program Files\Visual Studio 2022\VC\Auxiliary\Build\vcvars64.bat
in an existing shell, where the path specified will depend on the version and installation path of Visual Studio.
For more information on SCons, see the SCons Wiki and the SCons homepage.
CMake¶
CMake is a multi-platform build system that uses a high-level project
description to generate platform-specific build scripts (for example, on Linux,
CMake will generate Makefiles, and on Windows, it can generate Visual Studio .sln
files). The configuration file for a CMake project is called CMakeLists.txt
. A
typical CMakeLists.txt
file for compiling a program that uses Cantera might look
like this:
cmake_minimum_required(VERSION 3.1)
project (sample)
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_CXX_STANDARD 17)
find_package(Threads REQUIRED)
include_directories("/opt/cantera/include")
link_directories("/opt/cantera/lib")
add_executable(sample sample.cpp)
target_link_libraries(sample cantera_shared Threads::Threads)
Several example CMakeLists.txt
files are included with the C++ examples
contained in the samples/cxx
subdirectory of the Cantera installation directory,
which have the paths and lists of libraries correctly configured for the
system on which they are installed.
To build a program using CMake on Linux or macOS, run the following commands from the
directory containing the CMakeLists.txt
file:
mkdir build
cd build
cmake ..
cmake --build .
This will create an executable named sample
in the build
directory.
To build a program using CMake on Windows, run the following commands from the
directory containing the CMakeLists.txt
file:
mkdir build
cd build
cmake ..
cmake --build . --config Release
This will create an executable named sample.exe
in the build\Release
directory.
Libraries & Library Paths¶
Choosing Libraries During Compilation¶
Applications can be linked to either the Cantera static library or dynamically linked
to the Cantera shared library. Dynamic linking is recommended generally, and required
to enable features such as the use of ExtensibleRate
objects. The pre-configured
CMakelists.txt
and SConstruct
files included with the Cantera examples are set
up to use dynamic linking.
The Cantera Library¶
If Cantera was compiled with the renamed_shared_libraries=y
option, then you can
link to the Cantera shared library by specifying the library name cantera_shared
or
to the static library by specifying the library name cantera
. If Cantera was
compiled with the renamed_shared_libraries=n
option, then you can link to the shared
library by specifying the library named cantera
.
The renamed_shared_libraries=y
option is the default if you compiled Cantera
yourself, or if you installed packages for Windows. Cantera packages for Conda and
Ubuntu use the setting renamed_shared_libraries=n
.
Additional Dependencies¶
If you link to the Cantera shared library, you only need to link to that and any of your
program's direct dependencies. You do not need to link to any of Cantera's dependencies
unless your program also uses them directly. One unexpected direct dependency your
program may have is on the fmt
library, due to its use in C++ templates in Cantera.
If you link to the Cantera static library, you will also need to specify all of Cantera's library dependencies when linking your program, as well as the directories containing these libraries (if they are not in standard search directories).
Runtime Library Paths¶
Your operating system needs to be able to find the shared library dependencies of your program when it is run. This process is dependent primarily on your operating system.
Linux & macOS¶
If you linked to the Cantera shared library, you will need to provide the information needed to find the Cantera library; the Cantera library then contains the information needed to find its own dependencies such as SUNDIALS, LAPACK, and yaml-cpp. If you linked to the Cantera static library, your program depends directly on Cantera's dependencies instead, and you need to provide the information on where to find these dependencies when you run your program.
There are several options for specifying library search paths:
Specify the "rpath" when compiling and linking your program. This is done with the compiler option for GCC/Clang
-Wl,-rpath,/path/to/libdir
, where/path/to/libdir
is the directory containing the Cantera shared library. The build scripts provided with Cantera's examples are configured to use this option.If the libraries are installed into a standard system location, such as
/usr/lib
or/usr/local/lib
on Linux, they should be found automatically.Set the
LD_LIBRARY_PATH
(Linux) orDYLD_LIBRARY_PATH
(macOS) environment variable before running your program. For example, on Linux, use the command:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/libdir
Windows¶
On Windows, all shared library (DLL) dependencies need to be on the PATH
. You can
add the Cantera library directory to the PATH
temporarily, for a single command
prompt session, by running a command like:
set PATH=%PATH%;C:\Program Files\Cantera\bin
where the path added depends on where you installed Cantera.