Repository navigation
Building and Debugging from Visual Studio Code (Linux)
This article outlines the steps to create a CMake project from scratch directly from Visual Studio Code, then build and debug using the IAR Build Tools on Linux.
Using C and C++ we are going to create a simple project from scratch. The application prints "Hello World <N>!" in VS Code's Debug Console 10 times and then spins infinitely. The target will be a simulated Arm Cortex-M4 device.
Before starting, ensure you have administrative access to install software and that your system meets the hardware requirements for Arm development (e.g., Ubuntu 24.04 with sufficient RAM). The following software versions were used in this updated guide. Newer versions should work with minimal changes.
| Software | Version | Download Link |
|---|---|---|
| IAR Build Tools for Arm | 10.10.2 or later | Contact us |
| Microsoft Visual Studio Code | 1.141.0 or later | Download |
| CMake | 4.4.0 or later | Download |
- Ensure CMake is added to your system's
PATHenvironment variable for easy access. - If using Embedded Workbench for Arm 10.10.2 or later, adjust paths accordingly, e.g., replace
/opt/iar/cxarmwith/opt/iar/ewarmcwherever applicable.
- Open Visual Studio Code.
- Select:
File→Open Folder...(Ctrl+K, Ctrl+O). - Create and select a new empty folder (e.g.,
~/hello). Note: VS Code may prompt you to "trust" the folder's authors. Select "Yes" to enable full features. - In the folder, create the following structure:
📁 hello
┣ 📁 .vscode
┃ ┣ 📄 extensions.json
┃ ┣ 📄 launch.json
┃ ┗ 📄 settings.json
┣ 📄 .clangd
┣ 📄 CMakeLists.txt
┣ 📄 CMakePresets.json
┣ 📄 hello.cpp
┣ 📄 foo.c
┗ 📄 iccarm.cmake
- .vscode/extensions.json
- .vscode/launch.json
- .vscode/settings.json
- CMakeLists.txt
- CMakePresets.json
- foo.c
- hello.cpp
- iccarm.cmake:
# iccarm.cmake: a toolchain file for the IAR C/C++ Compiler for Arm
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
find_program(CMAKE_C_COMPILER
NAMES iccarm iccarm.exe
PATHS /opt/iar/cxarm
/opt/iar/ewarmc
/iar/cxarm-10.10.2
/iar/ewarmc-10.10.2
PATH_SUFFIXES arm/bin
REQUIRED
)
set(CMAKE_CXX_COMPILER ${CMAKE_C_COMPILER})
find_program(CMAKE_ASM_COMPILER
NAMES iasmarm iasmarm.exe
PATHS /opt/iar/cxarm
/opt/iar/ewarmc
/iar/cxarm-10.10.2
/iar/ewarmc-10.10.2
PATH_SUFFIXES arm/bin
REQUIRED
)
# Tell CMake we are cross-compiling
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)- .clangd:
# .clangd: valid for iccarm-10.10.2 (Linux)
CompileFlags:
Remove:
- -e
- -O*
- --cpu=*
- --fpu=*
- --c++
- --libc++
- --silent
- --no_*
- --dlib_config*
Add:
- -undef
- -nostdinc
- -Wno-unaligned-access
- -fiar-compiler
- -ferror-limit=0
- -funsigned-char
- -fiar-extensions
- -isystem
#- /opt/iar/ewarmc/arm/inc/c/aarch32
- /opt/iar/cxarm/arm/inc/c/aarch32
- -isystem
#- /opt/iar/ewarmc/arm/inc
- /opt/iar/cxarm/arm/inc
- -isystem
#- /opt/iar/ewarmc/arm/inc/c
- /opt/iar/cxarm/arm/inc/c
- --target=armv7m-none-eabi
- -D__thumb__=1
- -D__IAR_CLANGD__
- -D__CORE__=__ARM7M__
- -D__CHAR_BITS__=8
- -D__CHAR_BIT__=8
- -D__CHAR_MAX__=0xff
- -D__CHAR_MIN__=0
- -D__CHAR_SIZE__=1
- -D__UNSIGNED_CHAR_MAX__=0xff
- -D__SIGNED_CHAR_MAX__=127
- -D__SIGNED_CHAR_MIN__=(-__SIGNED_CHAR_MAX__-1)
- -D__CHAR_ALIGN__=1
- -D__SHORT_SIZE__=2
- -D__UNSIGNED_SHORT_MAX__=0xffff
- -D__SIGNED_SHORT_MAX__=32767
- -D__SIGNED_SHORT_MIN__=(-__SIGNED_SHORT_MAX__-1)
- -D__SHORT_ALIGN__=2
- -D__INT_SIZE__=4
- -D__UNSIGNED_INT_MAX__=0xffffffffU
- -D__SIGNED_INT_MAX__=2147483647
- -D__SIGNED_INT_MIN__=(-__SIGNED_INT_MAX__-1)
- -D__INT_ALIGN__=4
- -D__LONG_SIZE__=4
- -D__UNSIGNED_LONG_MAX__=0xffffffffUL
- -D__SIGNED_LONG_MAX__=2147483647L
- -D__SIGNED_LONG_MIN__=(-__SIGNED_LONG_MAX__-1)
- -D__LONG_ALIGN__=4
- -D__LONG_LONG_SIZE__=8
- -D__UNSIGNED_LONG_LONG_MAX__=0xffffffffffffffffULL
- -D__SIGNED_LONG_LONG_MAX__=9223372036854775807LL
- -D__SIGNED_LONG_LONG_MIN__=(-__SIGNED_LONG_LONG_MAX__-1)
- -D__LONG_LONG_ALIGN__=8
- -D__INT8_T_TYPE__=signed char
- -D__INT8_T_MAX__=127
- -D__INT8_T_MIN__=(-__INT8_T_MAX__-1)
- -D__UINT8_T_TYPE__=unsigned char
- -D__UINT8_T_MAX__=0xff
- -D__INT8_SIZE_PREFIX__="hh"
- -D__INT8_T_SIZE__=1
- -D__INT16_T_TYPE__=signed short int
- -D__INT16_T_MAX__=32767
- -D__INT16_T_MIN__=(-__INT16_T_MAX__-1)
- -D__UINT16_T_TYPE__=unsigned short int
- -D__UINT16_T_MAX__=0xffff
- -D__INT16_SIZE_PREFIX__="h"
- -D__INT16_T_SIZE__=2
- -D__INT32_T_TYPE__=signed int
- -D__INT32_T_MAX__=2147483647
- -D__INT32_T_MIN__=(-__INT32_T_MAX__-1)
- -D__UINT32_T_TYPE__=unsigned int
- -D__UINT32_T_MAX__=0xffffffffU
- -D__INT32_SIZE_PREFIX__=""
- -D__INT32_T_SIZE__=4
- -D__INT64_T_TYPE__=signed long long int
- -D__INT64_T_MAX__=9223372036854775807LL
- -D__INT64_T_MIN__=(-__INT64_T_MAX__-1)
- -D__UINT64_T_TYPE__=unsigned long long int
- -D__UINT64_T_MAX__=0xffffffffffffffffULL
- -D__INT64_SIZE_PREFIX__="ll"
- -D__INT64_T_SIZE__=8
- -D__INT_LEAST8_T_TYPE__=signed char
- -D__INT_LEAST8_T_MAX__=127
- -D__INT_LEAST8_T_MIN__=(-__INT_LEAST8_T_MAX__-1)
- -D__UINT_LEAST8_T_TYPE__=unsigned char
- -D__UINT_LEAST8_T_MAX__=0xff
- -D__INT8_C_SUFFIX__=
- -D__UINT8_C_SUFFIX__=
- -D__INT_LEAST8_SIZE_PREFIX__="hh"
- -D__INT_LEAST8_T_SIZE__=1
- -D__INT_LEAST16_T_TYPE__=signed short int
- -D__INT_LEAST16_T_MAX__=32767
- -D__INT_LEAST16_T_MIN__=(-__INT_LEAST16_T_MAX__-1)
- -D__UINT_LEAST16_T_TYPE__=unsigned short int
- -D__UINT_LEAST16_T_MAX__=0xffff
- -D__INT16_C_SUFFIX__=
- -D__UINT16_C_SUFFIX__=
- -D__INT_LEAST16_SIZE_PREFIX__="h"
- -D__INT_LEAST16_T_SIZE__=2
- -D__INT_LEAST32_T_TYPE__=signed int
- -D__INT_LEAST32_T_MAX__=2147483647
- -D__INT_LEAST32_T_MIN__=(-__INT_LEAST32_T_MAX__-1)
- -D__UINT_LEAST32_T_TYPE__=unsigned int
- -D__UINT_LEAST32_T_MAX__=0xffffffffU
- -D__INT32_C_SUFFIX__=
- -D__UINT32_C_SUFFIX__=U
- -D__INT_LEAST32_SIZE_PREFIX__=""
- -D__INT_LEAST32_T_SIZE__=4
- -D__INT_LEAST64_T_TYPE__=signed long long int
- -D__INT_LEAST64_T_MAX__=9223372036854775807LL
- -D__INT_LEAST64_T_MIN__=(-__INT_LEAST64_T_MAX__-1)
- -D__UINT_LEAST64_T_TYPE__=unsigned long long int
- -D__UINT_LEAST64_T_MAX__=0xffffffffffffffffULL
- -D__INT64_C_SUFFIX__=LL
- -D__UINT64_C_SUFFIX__=ULL
- -D__INT_LEAST64_SIZE_PREFIX__="ll"
- -D__INT_LEAST64_T_SIZE__=8
- -D__INT_FAST8_T_TYPE__=signed int
- -D__INT_FAST8_T_MAX__=2147483647
- -D__INT_FAST8_T_MIN__=(-__INT_FAST8_T_MAX__-1)
- -D__UINT_FAST8_T_TYPE__=unsigned int
- -D__UINT_FAST8_T_MAX__=0xffffffffU
- -D__INT_FAST8_SIZE_PREFIX__=""
- -D__INT_FAST8_T_SIZE__=4
- -D__INT_FAST16_T_TYPE__=signed int
- -D__INT_FAST16_T_MAX__=2147483647
- -D__INT_FAST16_T_MIN__=(-__INT_FAST16_T_MAX__-1)
- -D__UINT_FAST16_T_TYPE__=unsigned int
- -D__UINT_FAST16_T_MAX__=0xffffffffU
- -D__INT_FAST16_SIZE_PREFIX__=""
- -D__INT_FAST16_T_SIZE__=4
- -D__INT_FAST32_T_TYPE__=signed int
- -D__INT_FAST32_T_MAX__=2147483647
- -D__INT_FAST32_T_MIN__=(-__INT_FAST32_T_MAX__-1)
- -D__UINT_FAST32_T_TYPE__=unsigned int
- -D__UINT_FAST32_T_MAX__=0xffffffffU
- -D__INT_FAST32_SIZE_PREFIX__=""
- -D__INT_FAST32_T_SIZE__=4
- -D__INT_FAST64_T_TYPE__=signed long long int
- -D__INT_FAST64_T_MAX__=9223372036854775807LL
- -D__INT_FAST64_T_MIN__=(-__INT_FAST64_T_MAX__-1)
- -D__UINT_FAST64_T_TYPE__=unsigned long long int
- -D__UINT_FAST64_T_MAX__=0xffffffffffffffffULL
- -D__INT_FAST64_SIZE_PREFIX__="ll"
- -D__INT_FAST64_T_SIZE__=8
- -D__INTMAX_T_TYPE__=signed long long int
- -D__INTMAX_T_MAX__=9223372036854775807LL
- -D__INTMAX_T_MIN__=(-__INTMAX_T_MAX__-1)
- -D__UINTMAX_T_TYPE__=unsigned long long int
- -D__UINTMAX_T_MAX__=0xffffffffffffffffULL
- -D__INTMAX_C_SUFFIX__=LL
- -D__UINTMAX_C_SUFFIX__=ULL
- -D__INTMAX_SIZE_PREFIX__="ll"
- -D__INTMAX_T_SIZE__=8
- -D__ATOMIC_BOOL_LOCK_FREE=2
- -D__ATOMIC_CHAR_LOCK_FREE=2
- -D__ATOMIC_CHAR16_T_LOCK_FREE=2
- -D__ATOMIC_CHAR32_T_LOCK_FREE=2
- -D__ATOMIC_WCHAR_T_LOCK_FREE=2
- -D__ATOMIC_SHORT_LOCK_FREE=2
- -D__ATOMIC_INT_LOCK_FREE=2
- -D__ATOMIC_LONG_LOCK_FREE=2
- -D__ATOMIC_LLONG_LOCK_FREE=0
- -D__ATOMIC_POINTER_LOCK_FREE=2
- -D__FLT_RADIX__=2
- -D__FLOAT_SIZE__=4
- -D__FLOAT_ALIGN__=4
- -D__FLT_MANT_DIG__=24
- -D__FLT_DIG__=6
- -D__FLT_DECIMAL_DIG__=9
- -D__FLT_MAX_EXP__=128
- -D__FLT_MIN_EXP__=-125
- -D__FLT_MAX_10_EXP__=38
- -D__FLT_MIN_10_EXP__=-37
- -D__FLT_MAX__=3.40282347E+38
- -D__FLT_MIN__=1.17549435E-38
- -D__FLT_HAS_SUBNORM__=1
- -D__FLT_TRUE_MIN__=1.40129846E-45
- -D__FLT_DENORM_MIN__=1.40129846E-45
- -D__FLT_EPSILON__=1.1920929E-7
- -D__DOUBLE_SIZE__=8
- -D__DOUBLE_ALIGN__=8
- -D__DBL_MANT_DIG__=53
- -D__DBL_DIG__=15
- -D__DBL_DECIMAL_DIG__=17
- -D__DBL_MAX_EXP__=1024
- -D__DBL_MIN_EXP__=-1021
- -D__DBL_MAX_10_EXP__=308
- -D__DBL_MIN_10_EXP__=-307
- -D__DBL_MAX__=1.7976931348623157E+308
- -D__DBL_MIN__=2.2250738585072014E-308
- -D__DBL_HAS_SUBNORM__=1
- -D__DBL_TRUE_MIN__=4.9406564584124654E-324
- -D__DBL_DENORM_MIN__=4.9406564584124654E-324
- -D__DBL_EPSILON__=2.2204460492503131E-16
- -D__LONG_DOUBLE_SIZE__=8
- -D__LONG_DOUBLE_ALIGN__=8
- -D__LDBL_MANT_DIG__=53
- -D__LDBL_DIG__=15
- -D__LDBL_DECIMAL_DIG__=17
- -D__LDBL_MAX_EXP__=1024
- -D__LDBL_MIN_EXP__=-1021
- -D__LDBL_MAX_10_EXP__=308
- -D__LDBL_MIN_10_EXP__=-307
- -D__LDBL_MAX__=1.7976931348623157E+308
- -D__LDBL_MIN__=2.2250738585072014E-308
- -D__LDBL_HAS_SUBNORM__=1
- -D__LDBL_TRUE_MIN__=4.9406564584124654E-324
- -D__LDBL_DENORM_MIN__=4.9406564584124654E-324
- -D__LDBL_EPSILON__=2.2204460492503131E-16
- -D____FP16_SIZE__=2
- -D____FP16_ALIGN__=2
- -D__FLT16_MANT_DIG__=11
- -D__FLT16_DIG__=3
- -D__FLT16_DECIMAL_DIG__=5
- -D__FLT16_MAX_EXP__=16
- -D__FLT16_MIN_EXP__=-13
- -D__FLT16_MAX_10_EXP__=4
- -D__FLT16_MIN_10_EXP__=-4
- -D__FLT16_MAX__=6.5504E+4
- -D__FLT16_MIN__=6.1035E-5
- -D__FLT16_HAS_SUBNORM__=1
- -D__FLT16_TRUE_MIN__=5.9605E-8
- -D__FLT16_DENORM_MIN__=5.9605E-8
- -D__FLT16_EPSILON__=9.7656E-4
- -D___FLOAT16_SIZE__=2
- -D___FLOAT16_ALIGN__=2
- -D__NAN_HAS_HIGH_MANTISSA_BIT_SET__=0
- -D__SUBNORMAL_FLOATING_POINTS__=1
- -D__SIZE_T_TYPE__=unsigned int
- -D__SIZE_T_MAX__=0xffffffffU
- -D__SIZEOF_SIZE_T__=4
- -D__PTRDIFF_T_TYPE__=signed int
- -D__PTRDIFF_T_MAX__=2147483647
- -D__PTRDIFF_T_MIN__=(-__PTRDIFF_T_MAX__-1)
- -D__PTRDIFF_T_SIZE__=4
- -D__INTPTR_T_TYPE__=signed int
- -D__INTPTR_T_MAX__=2147483647
- -D__INTPTR_T_MIN__=(-__INTPTR_T_MAX__-1)
- -D__INTPTR_T_SIZE__=4
- -D__UINTPTR_T_TYPE__=unsigned int
- -D__UINTPTR_T_MAX__=0xffffffffU
- -D__INTPTR_SIZE_PREFIX__=""
- -D__JMP_BUF_ELEMENT_TYPE__=unsigned long long int
- -D__JMP_BUF_NUM_ELEMENTS__=8
- -D__TID__=0xcf60
- -D__VER__=10010002
- -D__BUILD_NUMBER__=628
- -D__IAR_SYSTEMS_ICC__=9
- -D_MAX_ALIGNMENT=8
- -D__LITTLE_ENDIAN__=1
- -D__BOOL_TYPE__=unsigned char
- -D__BOOL_SIZE__=1
- -D__WCHAR_T_TYPE__=unsigned int
- -D__WCHAR_T_SIZE__=4
- -D__WCHAR_T_MAX__=0xffffffffU
- -D__DEF_PTR_MEM__=__data
- -D__DEF_PTR_SIZE__=4
- -D__CODE_MEMORY_LIST1__()=__CODE_MEM_HELPER1__(__code, 0)
- -D__CODE_MEMORY_LIST2__(_P1)=__CODE_MEM_HELPER2__(__code, 0, _P1)
- -D__CODE_MEMORY_LIST3__(_P1,_P2)=__CODE_MEM_HELPER3__(__code, 0, _P1, _P2)
- -D__DATA_MEMORY_LIST1__()=__DATA_MEM_HELPER1__(__data, 0) __DATA_MEM_HELPER1__(__rev_data, 1)
- -D__DATA_MEMORY_LIST2__(_P1)=__DATA_MEM_HELPER2__(__data, 0, _P1) __DATA_MEM_HELPER2__(__rev_data, 1, _P1)
- -D__DATA_MEMORY_LIST3__(_P1,_P2)=__DATA_MEM_HELPER3__(__data, 0, _P1, _P2) __DATA_MEM_HELPER3__(__rev_data, 1, _P1, _P2)
- -D__DATA_MEM0__=__data
- -D__DATA_MEM0_POINTER_OK__=1
- -D__DATA_MEM0_UNIQUE_POINTER__=1
- -D__DATA_MEM0_VAR_OK__=1
- -D__DATA_MEM0_INDEX_TYPE__=int
- -D__DATA_MEM0_SIZE_TYPE__=unsigned int
- -D__DATA_MEM0_INTPTR_TYPE__=int
- -D__DATA_MEM0_UINTPTR_TYPE__=unsigned int
- -D__DATA_MEM0_INTPTR_SIZE_PREFIX__=""
- -D__DATA_MEM0_MAX_SIZE__=0x7fffffffU
- -D_RSIZE_MAX=0x7fffffffU
- -D__DATA_MEM0_HEAP_SEGMENT__="HEAP"
- -D__DATA_MEM0_PAGE_SIZE__=0
- -D__DATA_MEM0_HEAP__=0
- -D__DATA_MEM1__=__rev_data
- -D__DATA_MEM1_POINTER_OK__=1
- -D__DATA_MEM1_UNIQUE_POINTER__=0
- -D__DATA_MEM1_VAR_OK__=1
- -D__CODE_MEM0__=__code
- -D__CODE_MEM0_POINTER_OK__=1
- -D__CODE_MEM0_UNIQUE_POINTER__=1
- -D__CODE_PTR_MEMORY_LIST1__()=__CODE_PTR_MEM_HELPER1__(__code, 0)
- -D__CODE_PTR_MEMORY_LIST2__(_P1)=__CODE_PTR_MEM_HELPER2__(__code, 0, _P1)
- -D__CODE_PTR_MEMORY_LIST3__(_P1,_P2)=__CODE_PTR_MEM_HELPER3__(__code, 0, _P1, _P2)
- -D__DATA_PTR_MEMORY_LIST1__()=__DATA_PTR_MEM_HELPER1__(__data, 0)
- -D__DATA_PTR_MEMORY_LIST2__(_P1)=__DATA_PTR_MEM_HELPER2__(__data, 0, _P1)
- -D__DATA_PTR_MEMORY_LIST3__(_P1,_P2)=__DATA_PTR_MEM_HELPER3__(__data, 0, _P1, _P2)
- -D__VAR_MEMORY_LIST1__()=__VAR_MEM_HELPER1__(__data, 0)
- -D__VAR_MEMORY_LIST2__(_P1)=__VAR_MEM_HELPER2__(__data, 0, _P1)
- -D__VAR_MEMORY_LIST3__(_P1,_P2)=__VAR_MEM_HELPER3__(__data, 0, _P1, _P2)
- -D__VARD_MEMORY_LIST1__()=__VARD_MEM_HELPER1__(__data, 0, _)
- -D__HEAP_MEM0__=0
- -D__HEAP_DEFAULT_MEM__=0
- -D__HEAP_MEMORY_LIST1__()=__HEAP_MEM_HELPER1__(__data, 0)
- -D__HEAP_MEMORY_LIST2__(_P1)=__HEAP_MEM_HELPER2__(__data, 0, _P1)
- -D__HEAP_MEMORY_LIST3__(_P1,_P2)=__HEAP_MEM_HELPER3__(__data, 0, _P1, _P2)
- -D__HVAR_MEMORY_LIST1__()=__HVAR_MEM_HELPER1__(__data, 0)
- -D__HEAPD_MEMORY_LIST1__()=__HEAPD_MEM_HELPER1__(__data, 0, _)
- -D__HEAPU_MEMORY_LIST1__()=__HEAPU_MEM_HELPER1__(__data, 0)
- -D__HEAPND_MEMORY_LIST1__()=
- -D__MULTIPLE_HEAPS__=0
- -D__TOPM_DATA_MEMORY_LIST1__()=__TOPM_DATA_MEM_HELPER1__(__rev_data, 1)
- -D__TOPM_DATA_MEMORY_LIST2__(_P1)=__TOPM_DATA_MEM_HELPER2__(__rev_data, 1, _P1)
- -D__TOPM_DATA_MEMORY_LIST3__(_P1,_P2)=__TOPM_DATA_MEM_HELPER3__(__rev_data, 1, _P1, _P2)
- -D__TOPP_DATA_MEMORY_LIST1__()=__TOPP_DATA_MEM_HELPER1__(__data, 0) __TOPP_DATA_MEM_HELPER1__(__rev_data, 1)
- -D__TOPP_DATA_MEMORY_LIST2__(_P1)=__TOPP_DATA_MEM_HELPER2__(__data, 0, _P1) __TOPP_DATA_MEM_HELPER2__(__rev_data, 1, _P1)
- -D__TOPP_DATA_MEMORY_LIST3__(_P1,_P2)=__TOPP_DATA_MEM_HELPER3__(__data, 0, _P1, _P2) __TOPP_DATA_MEM_HELPER3__(__rev_data, 1, _P1, _P2)
- -D__DEF_HEAP_MEM__=__data
- -D__DEF_STACK_MEM_INDEX__=0
- -D__PRAGMA_PACK_ON__=1
- -D__MULTIPLE_INHERITANCE__=1
- -D__FOR_DEBUG__=
- -D__ELF__=1
- -D__AAPCS__=1
- -D__ARM4TM__=4
- -D__ARM5TM__=5
- -D__ARM5T__=5
- -D__ARM5__=5
- -D__ARM6M__=11
- -D__ARM6SM__=12
- -D__ARM6T2__=6
- -D__ARM6__=6
- -D__ARM7M__=7
- -D__ARM7__=7
- -D__ARM_32BIT_STATE=1
- -D__ARM_ACLE=201
- -D__ARM_ALIGN_MAX_PWR=8
- -D__ARM_ALIGN_MAX_STACK_PWR=3
- -D__ARM_ARCH=7
- -D__ARM_ARCH_ISA_THUMB=2
- -D__ARM_ARCH_PROFILE='M'
- -D__ARM_FEATURE_CLZ=1
- -D__ARM_FEATURE_COPROC=15
- -D__ARM_FEATURE_IDIV=1
- -D__ARM_FEATURE_LDREX=7
- -D__ARM_FEATURE_MVE=0
- -D__ARM_FEATURE_QBIT=1
- -D__ARM_FEATURE_SAT=1
- -D__ARM_FEATURE_UNALIGNED=1
- -D__ARM_FP16_ARGS=1
- -D__ARM_FP16_FORMAT_IEEE=1
- -D__ARM_PCS=1
- -D__ARM_PROFILE_M__=1
- -D__ARM_SIZEOF_MINIMAL_ENUM=1
- -D__ARM_SIZEOF_WCHAR_T=4
- -D__ARM_SIZE_MINIMAL_ENUM=1
- -D__ARM_SIZE_WCHAR_T=4
- -D__CODE_SIZE_LIMIT=0
- -D__CPU_MODE__=1
- -D__GOT_INDIRECT=0
- -D__IAR_PCS_TRUST=1
- -D__ICCARM_INTRINSICS_VERSION__=2
- -D__ICCARM__=1
- -D__INTERWORKING__=1
- -D__PLAIN_INT_BITFIELD_IS_SIGNED__=0
- -D__HAS_WEAK__=1
- -D__HAS_PACKED__=1
- -D__HAS_JOINED_TYPES__=1
- -D__HAS_LOCATED_DECLARATION__=1
- -D__HAS_LOCATED_WITH_INIT__=1
- -D__IAR_COMPILERBASE__=0xa1600
- -D__IAR_COMPILERBASE_STR__=10.22.0.9999
- -D__UNICODE_SOURCE_SUPPORTED__=1
- -D__VTABLE_MEM__=
- -D__PRAGMA_REDEFINE_EXTNAME=1
- -D__STDC__=1
- -D__STDC_VERSION__=201710L
- -D__STDC_IEC_559__=1
- -D__STDC_IEC_559_COMPLEX__=1
- -D__STDC_NO_VLA__=1
- -D__MEMORY_ORDER_RELAXED__=0
- -D__MEMORY_ORDER_CONSUME__=1
- -D__MEMORY_ORDER_ACQUIRE__=2
- -D__MEMORY_ORDER_RELEASE__=3
- -D__MEMORY_ORDER_ACQ_REL__=4
- -D__MEMORY_ORDER_SEQ_CST__=5
- -D__ATOMIC_RELAXED=0
- -D__ATOMIC_CONSUME=2
- -D__ATOMIC_ACQUIRE=2
- -D__ATOMIC_RELEASE=3
- -D__ATOMIC_ACQ_REL=4
- -D__ATOMIC_SEQ_CST=5
- -D__STDC_UTF_16__=1
- -D__STDC_UTF_32__=1
- -D__STDC_LIB_EXT1__=201112L
- -D__STDC_NO_THREADS__=1
- -D__STDC_ISO_10646__=201103L
- -D__STDC_HOSTED__=1
- -D__WCHAR_T=1
- -D__CHAR16_T_AND_CHAR32_T=1
- -D__BOOL=1
- -D__ARRAY_OPERATORS=1
- -D__EDG_IA64_ABI=1
- -D__EDG_IA64_ABI_VARIANT_CTORS_AND_DTORS_RETURN_THIS=1
- -D__EDG_IA64_ABI_USE_INT_STATIC_INIT_GUARD=1
- -D__EDG_TYPE_TRAITS_ENABLED=1
- -D__VARIADIC_TEMPLATES=1
- -D__STDCPP_THREADS__=1
- -D__STDCPP_DEFAULT_NEW_ALIGNMENT__=8u
- -D__EDG_CONSTEXPR_ENABLED__=1
- -D__EDG__=1
- -D__EDG_VERSION__=606
- -D__EDG_SIZE_TYPE__=unsigned int
- -D__EDG_PTRDIFF_TYPE__=int
- -D__EDG_DELTA_TYPE=int
- -D__EDG_IA64_VTABLE_ENTRY_TYPE=int
- -D__EDG_VIRTUAL_FUNCTION_INDEX_TYPE=unsigned short
- -D__EDG_LOWER_VARIABLE_LENGTH_ARRAYS=1
- -D__EDG_IA64_ABI_USE_VARIANT_ARRAY_COOKIES=1
- -D__EDG_ABI_COMPATIBILITY_VERSION=9999
- -D__EDG_ABI_CHANGES_FOR_RTTI=1
- -D__EDG_ABI_CHANGES_FOR_ARRAY_NEW_AND_DELETE=1
- -D__EDG_ABI_CHANGES_FOR_PLACEMENT_DELETE=1
- -D__EDG_BSD=0
- -D__EDG_SYSV=0
- -D__EDG_ANSIC=1
- -D__EDG_CPP11_IL_EXTENSIONS_SUPPORTED=1
- -D__EDG_HOST_HAS_FLOAT16_TYPE=1
- -D__EDG_FLOAT80_ENABLING_POSSIBLE=0
- -D__EDG_FLOAT128_ENABLING_POSSIBLE=0
- -D__EDG_INT128_EXTENSIONS_ALLOWED=0
- -D_DLIB_CONFIG_FILE_HEADER_NAME="DLib_Config_Full.h"
- -D_DLIB_CONFIG_FILE_STRING="DLib_Config_Full.h"
- -D__VERSION__="IAR ANSI C/C++ Compiler V10.10.2.628/LNX for ARM"
- -D_VA_DEFINED=
- -D_VA_LIST=__builtin_va_list
- -D__ALIGNOF__=__alignof__
- -D__absolute=
- -D__arm=
- -D__assignment_by_bitwise_copy_allowed(Ty0)=1
- -D__c99_generic(...)=
- -D__code=
- -D__constrange(a,...)=
- -D__construction_by_bitwise_copy_allowed(Ty0)=1
- -D__data=
- -D__has_constructor=__is_trivially_constructible
- -D__has_destructor=__is_trivially_constructible
- -D__inited=
- -D__inline=
- -D__inline__=
- -D__interwork=
- -D__intrinsic=
- -D__monitor=
- -D__naked=
- -D__nested=
- -D__no_alloc=
- -D__no_alloc16=
- -D__no_init=
- -D__no_scratch=
- -D__noreturn=
- -D__nounwind=
- -D__out_of_image=
- -D__packed=
- -D__pcrel=
- -D__ramfunc=
- -D__ro_placement=
- -D__root=
- -D__section_begin(...)=((void *) 0)
- -D__section_end(...)=((void *) 0)
- -D__section_size(...)=0
- -D__segment_begin(...)=((void *) 0)
- -D__segment_end(...)=((void *) 0)
- -D__segment_size(...)=0
- -D__sfb(...)=((void *) 0)
- -D__sfe(...)=((void *) 0)
- -D__sfs(...)=0
- -D__spec_string=
- -D__stackless=
- -D__swi=
- -D__task=
- -D__thumb=
- -D__weak=
- -D__weak_test=
- -D__aeabi_memclr(Ty0, Ty1)=
- -D__aeabi_memcpy(Ty0, Ty1, Ty2)=
- -D__aeabi_memmove(Ty0, Ty1, Ty2)=
- -D__aeabi_memset(Ty0, Ty1, Ty2)=
- -D__aeabi_memclr4(Ty0, Ty1)=
- -D__aeabi_memcpy4(Ty0, Ty1, Ty2)=
- -D__aeabi_memmove4(Ty0, Ty1, Ty2)=
- -D__aeabi_memset4(Ty0, Ty1, Ty2)=
- -D__aeabi_memclr8(Ty0, Ty1)=
- -D__aeabi_memcpy8(Ty0, Ty1, Ty2)=
- -D__aeabi_memmove8(Ty0, Ty1, Ty2)=
- -D__aeabi_memset8(Ty0, Ty1, Ty2)=
- -D__get_SP()=0
- -D__get_PC()=0
- -D__iar_atomic_init(Ty0, Ty1)=
- -D__iar_atomic_init(Ty0, Ty1, Ty2)=
- -D__iar_atomic_load(Ty0, Ty1)=0
- -D__iar_atomic_exchange(Ty0, Ty1, Ty2)=0
- -D__iar_atomic_compare_exchange_strong(Ty0, Ty1, Ty2, Ty3, Ty4)=0
- -D__iar_atomic_compare_exchange_weak(Ty0, Ty1, Ty2, Ty3, Ty4)=0
- -D__iar_atomic_fetch_add(...)=0
- -D__iar_atomic_fetch_sub(...)=0
- -D__iar_atomic_fetch_or(...)=0
- -D__iar_atomic_fetch_xor(...)=0
- -D__iar_atomic_fetch_and(...)=0
- -D__iar_bits2fp32(Ty0)=0.0f
- -D__iar_bits2fp64(Ty0)=0.0
- -D__iar_cast_to(Ty0)=
- -D__iar_fp2bits32(Ty0)=0
- -D__iar_fp2bits64(Ty0)=0
- -D__iar_fpgethi64(Ty0)=0
- -D__iar_fpsethi64(Ty0, Ty1)=0.0
- -D__iar_generic(...)=
- -D___iar_is_complete(...)=__is_complete_type
- -D__no_alloc_str(...)=((unsigned long)0)
- -D__no_alloc_str16(...)=((unsigned short)0)
- -D__INTADDR__(...)=((unsigned int)0)
- -D__NAN__=0.0
- -D__INFINITY__=0.0
- -D__I__=__imag__
- -Dtypeof(Ty0)=__typeof__(Ty0)
---
If:
PathMatch: [.*\.(c|h)$]
CompileFlags:
Add:
- -std=c17
- -xc
---
If:
PathMatch: [.*\.(cc|cxx|cpp|hpp)$]
CompileFlags:
Add:
- -isystem
# - /opt/iar/ewarmc/arm/inc/libcpp
- /opt/iar/cxarm/arm/inc/libcpp
- -D__cplusplus=202002L
- -D__cpp_aggregate_bases=201603L
- -D__cpp_aggregate_paren_init=201902L
- -D__cpp_aligned_new=201606L
- -D__cpp_capture_star_this=201603L
- -D__cpp_concepts=202002L
- -D__cpp_conditional_explicit=201806L
- -D__cpp_consteval=201811L
- -D__cpp_constexpr_dynamic_alloc=201907L
- -D__cpp_constinit=201907L
- -D__cpp_designated_initializers=201707L
- -D__cpp_explicit_bool=201806L
- -D__cpp_fold_expressions=201603L
- -D__cpp_guaranteed_copy_elision=201606L
- -D__cpp_hex_float=201603L
- -D__cpp_if_constexpr=201606L
- -D__cpp_impl_destroying_delete=201806L
- -D__cpp_impl_three_way_comparison=201907L
- -D__cpp_initializer_lists=200806L
- -D__cpp_inline_variables=201606L
- -D__cpp_namespace_attributes=201411L
- -D__cpp_nested_namespace_definitions=201411L
- -D__cpp_noexcept_function_type=201510L
- -D__cpp_nontype_template_parameter_auto=201606L
- -D__cpp_sized_deallocation=201309L
- -D__cpp_structured_bindings=201606L
- -D__cpp_template_template_args=201611L
- -D__cpp_unicode_characters=200704L
- -D__cpp_using_enum=201907L
- -D__cpp_variadic_using=201611L
- -D__cpp_aggregate_nsdmi=201304L
- -D__cpp_alias_templates=200704L
- -D__cpp_attributes=200809L
- -D__cpp_binary_literals=201304L
- -D__cpp_decltype=200707L
- -D__cpp_decltype_auto=201304L
- -D__cpp_delegating_constructors=200604L
- -D__cpp_inheriting_constructors=201511L
- -D__cpp_lambdas=200907L
- -D__cpp_nsdmi=200809L
- -D__cpp_raw_strings=200710L
- -D__cpp_ref_qualifiers=200710L
- -D__cpp_return_type_deduction=201304L
- -D__cpp_rvalue_references=200610L
- -D__cpp_threadsafe_static_init=200806L
- -D__cpp_unicode_literals=200710L
- -D__cpp_user_defined_literals=200809L
- -D__cpp_variable_templates=201304L
- -D__cpp_variadic_templates=200704L
- -D__cpp_enumerator_attributes=201411L
- -D__cpp_constexpr=202002L
- -D__cpp_deduction_guides=201907L
- -D__cpp_range_based_for=201603L
- -D__cpp_nontype_template_args=201911L
- -D__cpp_static_assert=201411L
- -D__cpp_init_captures=201803L
- -D__cpp_generic_lambdas=201707L
- -D_LIBCPP=1
- -D_LIBCPP_ABI_VERSION=2
- -D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS=1
- -D_LIBCPP_NO_ABI_TAG=
- -D_LIBCPP_REMOVE_TRANSITIVE_INCLUDES=
- -D_LIBCPP_HAS_NO_THREADS=1
- -D_LIBCPP_HAS_NO_OFF_T_FUNCTIONS=1
- -D_LIBCPP_HAS_NO_MONOTONIC_CLOCK=1
- -D_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS
- -std=c++20
- -xc++- Press CTRL+SHIFT+P to open the Command Palette.
- Type and select CMake: Build.
Output:
[main] Building folder: /home/user/hello/build
[main] Configuring project: hello
[proc] Executing command: /usr/local/bin/cmake "-DCMAKE_CONFIGURATION_TYPES:STRING=Coverage;Debug;Release;RelWithDebInfo;MinSizeRel;Medium;HighSpeed;MaxSpeed" -DCMAKE_PRESET_NAME:STRING=ninja-multi -DCMAKE_SYSTEM_NAME=Generic "-DCMAKE_C_FLAGS_COVERAGE:STRING=-On -r" "-DCMAKE_CXX_FLAGS_COVERAGE:STRING=-On -r" "-DCMAKE_C_FLAGS_MEDIUM:STRING=-Om -DNDEBUG" "-DCMAKE_CXX_FLAGS_MEDIUM:STRING=-Om -DNDEBUG" "-DCMAKE_C_FLAGS_HIGHSPEED:STRING=-Ohs -DNDEBUG" "-DCMAKE_CXX_FLAGS_HIGHSPEED:STRING=-Ohs -DNDEBUG" "-DCMAKE_C_FLAGS_MAXSPEED:STRING=-Ohs --no_size_constraints -DNDEBUG" "-DCMAKE_CXX_FLAGS_MAXSPEED:STRING=-Ohs --no_size_constraints -DNDEBUG" -DCMAKE_TOOLCHAIN_FILE=/home/user/hello/iccarm.cmake -Wno-unused-cli -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -S /home/user/hello -B /home/user/hello/build -G "Ninja Multi-Config"
[cmake] -- Configuring done (0.3s)
[cmake] -- Generating done (0.0s)
[cmake] -- Build files have been written to: /home/user/hello/build
[build] Starting build
[proc] Executing command: /usr/local/bin/cmake --build /home/user/hello/build --config Debug --
[build] [1/3] Building C object CMakeFiles/hello.dir/Debug/foo.o
[build] [2/3] Building CXX object CMakeFiles/hello.dir/Debug/hello.o
[build] [3/3] Linking CXX executable Debug/hello.elf
[driver] Build completed: 00:00:02.629
[build] Build finished with exit code 0
Visual Studio Code uses the debug configuration from .vscode/launch.json, which was initially set to work with a simulated target in the C-SPY Debugger.
- In hello.cpp, click the gutter next to
for (;;) {near line 19 to set a breakpoint. - Press F5 or go to Run → Start Debugging.

For real hardware (e.g., STM32F4-DISCO board with a J-Link probe), add a new configuration to .vscode/launch.json:
}, // previous configuration ends here: add a comma and continue with a new body { ... }
{
"type": "cspy",
"name": "C-SPY: J-Link",
"request": "launch", // "attach" also supported
"program": "${command:cmake.launchTargetPath}",
"stopOnEntry": true,
"workbenchPath": "/opt/iarsystems/bxarm",
"target": "arm",
"driver": "J-Link",
"leaveTargetRunning": false,
"driverOptions": [ // Match your CPU and probe
"--device=STM32F407VG",
"--cpu=Cortex-M4",
"--fpu=VFPv4_SP",
"-p /opt/iar/cxarm/arm/config/debugger/ST/STM32F407VG.ddf",
"--semihosting",
"--drv_communication=USB0",
"--drv_interface=SWD"
]
}
]
}For details on each supported attribute, refer to the autocompletion suggestions and tooltips provided directly in the launch.json file.
With the IAR C-SPY Debug extension you can enable flexible workflows, such as one to flash and launch the application in C-SPY, and another to reattach to the running target as needed ("leaveTargetRunning": true and "request": "attach").
The driverOptions attribute accepts C-SPY command-line parameters. For complete reference, see The C-SPY command line utility—cspybat.
This article described the steps for preparing a CMake project from scratch in Visual Studio Code, build it with the IAR C/C++ Compiler and debug it with the IAR C-SPY Debugger on Linux.
This is the cmake-tutorial wiki. Back to Wiki Home
- IAR Compiler options in a CMake project
- IAR ILINK options in a CMake project
- Language-specific target options
- Selecting build types
- Using Ninja Multi-Config
- Filing a build log
- Multi-file compilation
- Invoking IAR binary utilities
- Use the IAR ELF Tool to convert executable targets to their binary formats
- Using IAR Build Tools with CMake Presets