blob: 48de7a2f163e3778a9e38fd5c69594494acc81a5 [file] [log] [blame]
# Adding a Library #
Now we will add a library to our project. This library will contain our own
implementation for computing the square root of a number. The executable can
then use this library instead of the standard square root function provided by
the compiler.
For this tutorial we will put the library into a subdirectory
called MathFunctions. It will have the following one line CMakeLists file:
add_library(MathFunctions mysqrt.cxx)
The source file mysqrt.cxx has one function called mysqrt that provides similar
functionality to the compilers sqrt function. To make use of the new library
we add an add_subdirectory call in the top-level CMakeLists file so that the
library will get built. We add the new library to the executable, and add the
MathFunctions as an include directory so that mqsqrt.h header file can be
found. The last few lines of the top-level CMakeLists file now look like:
#add the executable
add_executable(Tutorial tutorial.cxx)
target_link_libraries(Tutorial ${EXTRA_LIBS})
Now let us make the MathFunctions library optional. While for the tutorial
there really isnt any need to do so, but with larger projects this is a common
occurrence. The first step is to add an option to the top-level CMakeLists file.
option (USE_MYMATH
"Use tutorial provided math implementation" ON)
This will show up in CMake GUI and ccmake with a default value of ON that can
be changed by the user. This setting will be stored so that the user does not
need to set the value each time they run CMake on this build directory.
The next change is to make building and linking the MathFunctions library
conditional. To do this we change the top-level CMakeLists file to look like
the following:
cmake_minimum_required(VERSION 3.3)
# the version number.
set(Tutorial_VERSION_MAJOR 1)
set(Tutorial_VERSION_MINOR 0)
# configure a header file to pass some of the CMake settings
# to the source code
# should we use our own math functions
option(USE_MYMATH "Use tutorial provided math implementation" ON)
# add the MathFunctions library?
list(APPEND EXTRA_LIBS MathFunctions)
# add the executable
add_executable(Tutorial tutorial.cxx)
target_link_libraries(Tutorial ${EXTRA_LIBS})
# add the binary tree to the search path for include files
# so that we will find TutorialConfig.h
target_include_directories(Tutorial PUBLIC
Note the use of the variables EXTRA_LIBS, and EXTRA_INCLUDES to collect
up any optional libraries to later be linked into the executable. This is a
classic approach when dealing with many optional components, we will cover the
modern approach in the next step. For now the corresponding changes to the
source code are fairly straightforward and leave us with:
double outputValue = mysqrt(inputValue);
double outputValue = sqrt(inputValue);
Since the source code now requires USE_MYMATH we can add it to the Simply add the following line:
#cmakedefine USE_MYMATH
Run cmake or cmake-gui to configure the project and then build it with your
chosen build tool and then run the built Tutorial executable.
Which function gives better results, Step1s sqrt or Step2s mysqrt?