Skip to content

Building and Debugging from Visual Studio Code (Linux)

Felipe Torrezan edited this page Oct 12, 2026 · 16 revisions

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.

Prerequisites and Required Software

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 PATH environment variable for easy access.
  • If using Embedded Workbench for Arm 10.10.2 or later, adjust paths accordingly, e.g., replace /opt/iar/cxarm with /opt/iar/ewarmc wherever applicable.

Step-by-step Procedure

  1. Open Visual Studio Code.
  2. Select: File → Open Folder... (Ctrl+K, Ctrl+O).
  3. 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.
  4. 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

Files

# 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++

Build the CMake project

  1. Press CTRL+SHIFT+P to open the Command Palette.
  2. 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

Debugging

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.

  1. In hello.cpp, click the gutter next to for (;;) { near line 19 to set a breakpoint.
  2. Press F5 or go to Run → Start Debugging.

alt

Modifying the launch configuration for hardware 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.

Summary

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.

Clone this wiki locally