Build Targets
Syntax#
- add_executable(target_name [EXCLUDE_FROM_ALL] source1 [source2…])
- add_library(lib_name [STATIC|SHARED|MODULE] [EXCLUDE_FROM_ALL] source1 [source2 …])
Executables
To create a build target producing an executable, one should use the add_executable
command:
add_executable(my_exe
main.cpp
utilities.cpp)
This creates a build target, e.g. make my_exe
for GNU make, with the appropriate invocations of the configured compiler to produce an executable my_exe
from the two source files main.cpp
and utilities.cpp
.
By default, all executable targets are added to the builtin all
target (all
for GNU make, BUILD_ALL
for MSVC).
To exclude an executable from being built with the default all
target, one can add the optional parameter EXCLUDE_FROM_ALL
right after the target name:
add_executable(my_optional_exe EXCLUDE_FROM_ALL main.cpp)
Libraries
To create an build target that creates an library, use the add_library
command:
add_library(my_lib lib.cpp)
The CMake variable BUILD_SHARED_LIBS
controls whenever to build an static (OFF
) or an shared (ON
) library, using for example cmake .. -DBUILD_SHARED_LIBS=ON
. However, you can explicitly set to build an shared or an static library by adding STATIC
or SHARED
after the target name:
add_library(my_shared_lib SHARED lib.cpp) # Builds an shared library
add_library(my_static_lib STATIC lib.cpp) # Builds an static library
The actual output file differs between systems. For example, an shared library on Unix systems is usually called libmy_shared_library.so
, but on Windows it would be my_shared_library.dll
and my_shared_library.lib
.
Like add_executable
, add EXCLUDE_FROM_ALL
before the list of source files to exclude it from the all
target:
add_library(my_lib EXCLUDE_FROM_ALL lib.cpp)
Libraries, that are designed to be loaded at runtime (for example plugins or applications using something like dlopen
), should use MODULE
instead of SHARED
/STATIC
:
add_library(my_module_lib MODULE lib.cpp)
For example, on Windows, there won’t be a import (.lib
) file, because the symbols are directly exported in the .dll
.