This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

C++ compilers for nRF52

Hi, I wonder if anyone knows any free C++ compilers for nRF52. I tried the mbed but it is not fully supported for nRF52.

The regular GNU GCC: arm-none-eabi-gcc works perfectly for nRF52, but I am unable to make the arm-none-eabi-g++ work. Was anyone able to use g++ on nRF and has any sample code to share ?

Thanks !

  • what do you mean 'you are unable to make g++ work'? I compile a mix of C and C++ with GNU ARM and I've never had a problem. What is the error?

  • Thanks guys for your help. I tried to edit the Makefile, but I am getting an error. I only changed the name of the file main.c to main.cpp

    *The error: make: *** No rule to make target _build/CPP_SOURCE_FILES', needed bynrf52832_xxaa'. Stop.

    Any idea ?

    *Here is the Makefile:

    PROJECT_NAME := uart_pca10040

    export OUTPUT_FILENAME #MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) MAKEFILE_NAME := $(MAKEFILE_LIST) MAKEFILE_DIR := $(dir $(MAKEFILE_NAME) )

    TEMPLATE_PATH = ../../../../../components/toolchain/gcc ifeq ($(OS),Windows_NT) include $(TEMPLATE_PATH)/Makefile.windows else include $(TEMPLATE_PATH)/Makefile.posix endif

    MK := mkdir RM := rm -rf

    #echo suspend ifeq ("$(VERBOSE)","1") NO_ECHO := else NO_ECHO := @ endif

    Toolchain commands

    CC := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-gcc' CXX := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-c++" AS := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-as' AR := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-ar' -r LD := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-ld' NM := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-nm' OBJDUMP := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-objdump' OBJCOPY := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-objcopy' SIZE := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-size'

    #function for removing duplicates in a list remduplicates = $(strip $(if $1,$(firstword $1) $(call remduplicates,$(filter-out $(firstword $1),$1))))

    #source common to all targets C_SOURCE_FILES +=
    $(abspath ../../../../../components/toolchain/system_nrf52.c)
    $(abspath ../../../../../components/libraries/util/app_error.c)
    $(abspath ../../../../../components/libraries/util/app_error_weak.c)
    $(abspath ../../../../../components/libraries/fifo/app_fifo.c)
    $(abspath ../../../../../components/libraries/util/app_util_platform.c)
    $(abspath ../../../../../components/libraries/util/nrf_assert.c)
    $(abspath ../../../../../components/libraries/uart/retarget.c)
    $(abspath ../../../../../components/libraries/uart/app_uart_fifo.c)
    $(abspath ../../../../../components/drivers_nrf/delay/nrf_delay.c)
    $(abspath ../../../../../components/drivers_nrf/common/nrf_drv_common.c)
    $(abspath ../../../../../components/drivers_nrf/uart/nrf_drv_uart.c)
    CPP_SOURCE_FILES +=
    $(abspath ../../../main.cpp) \

    #assembly files common to all targets ASM_SOURCE_FILES = $(abspath ../../../../../components/toolchain/gcc/gcc_startup_nrf52.s)

    #includes common to all targets INC_PATHS = -I$(abspath ../../config/uart_pca10040) INC_PATHS += -I$(abspath ../../config) INC_PATHS += -I$(abspath ../../../../bsp) INC_PATHS += -I$(abspath ../../../../../components/drivers_nrf/nrf_soc_nosd) INC_PATHS += -I$(abspath ../../../../../components/device) INC_PATHS += -I$(abspath ../../../../../components/libraries/uart) INC_PATHS += -I$(abspath ../../../../../components/drivers_nrf/hal) INC_PATHS += -I$(abspath ../../../../../components/drivers_nrf/delay) INC_PATHS += -I$(abspath ../../../../../components/toolchain/CMSIS/Include) INC_PATHS += -I$(abspath ../..) INC_PATHS += -I$(abspath ../../../../../components/libraries/util) INC_PATHS += -I$(abspath ../../../../../components/drivers_nrf/uart) INC_PATHS += -I$(abspath ../../../../../components/drivers_nrf/common) INC_PATHS += -I$(abspath ../../../../../components/toolchain) INC_PATHS += -I$(abspath ../../../../../components/drivers_nrf/config) INC_PATHS += -I$(abspath ../../../../../components/libraries/fifo) INC_PATHS += -I$(abspath ../../../../../components/toolchain/gcc) INC_PATHS += -I$(abspath ../../MyGPS_Lib)

    OBJECT_DIRECTORY = _build LISTING_DIRECTORY = $(OBJECT_DIRECTORY) OUTPUT_BINARY_DIRECTORY = $(OBJECT_DIRECTORY)

    Sorting removes duplicates

    BUILD_DIRECTORIES := $(sort $(OBJECT_DIRECTORY) $(OUTPUT_BINARY_DIRECTORY) $(LISTING_DIRECTORY) )

    #flags common to all targets CFLAGS = -DNRF52_PAN_12 CFLAGS += -DNRF52_PAN_15 CFLAGS += -DNRF52_PAN_58 CFLAGS += -DNRF52_PAN_20 CFLAGS += -DNRF52_PAN_54 CFLAGS += -DNRF52_PAN_31 CFLAGS += -DNRF52_PAN_30 CFLAGS += -DNRF52_PAN_51 CFLAGS += -DNRF52_PAN_36 CFLAGS += -DNRF52_PAN_53 CFLAGS += -DCONFIG_GPIO_AS_PINRESET CFLAGS += -DNRF52_PAN_64 CFLAGS += -DNRF52_PAN_55 CFLAGS += -DNRF52_PAN_62 CFLAGS += -DNRF52_PAN_63 CFLAGS += -DBOARD_PCA10040 CFLAGS += -DNRF52 CFLAGS += -DBSP_DEFINES_ONLY CFLAGS += -mcpu=cortex-m4 CFLAGS += -mthumb -mabi=aapcs --std=gnu99 CFLAGS += -Wall -Werror -O3 -g3 CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16

    keep every function in separate section. This will allow linker to dump unused functions

    CFLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing CFLAGS += -fno-builtin --short-enums

    CXX Flags

    keep every function in separate section. This will allow linker to dump unused functions

    LDFLAGS += -Xlinker -Map=$(LISTING_DIRECTORY)/$(OUTPUT_FILENAME).map LDFLAGS += -mthumb -mabi=aapcs -L $(TEMPLATE_PATH) -T$(LINKER_SCRIPT) LDFLAGS += -mcpu=cortex-m4 LDFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16

    let linker to dump unused sections

    LDFLAGS += -Wl,--gc-sections

    use newlib in nano version

    LDFLAGS += --specs=nano.specs -lc -lnosys

    Assembler flags

    ASMFLAGS += -x assembler-with-cpp ASMFLAGS += -DNRF52_PAN_12 ASMFLAGS += -DNRF52_PAN_15 ASMFLAGS += -DNRF52_PAN_58 ASMFLAGS += -DNRF52_PAN_20 ASMFLAGS += -DNRF52_PAN_54 ASMFLAGS += -DNRF52_PAN_31 ASMFLAGS += -DNRF52_PAN_30 ASMFLAGS += -DNRF52_PAN_51 ASMFLAGS += -DNRF52_PAN_36 ASMFLAGS += -DNRF52_PAN_53 ASMFLAGS += -DCONFIG_GPIO_AS_PINRESET ASMFLAGS += -DNRF52_PAN_64 ASMFLAGS += -DNRF52_PAN_55 ASMFLAGS += -DNRF52_PAN_62 ASMFLAGS += -DNRF52_PAN_63 ASMFLAGS += -DBOARD_PCA10040 ASMFLAGS += -DNRF52 ASMFLAGS += -DBSP_DEFINES_ONLY

    #default target - first one defined default: clean nrf52832_xxaa

    #building all targets all: clean $(NO_ECHO)$(MAKE) -f $(MAKEFILE_NAME) -C $(MAKEFILE_DIR) -e cleanobj $(NO_ECHO)$(MAKE) -f $(MAKEFILE_NAME) -C $(MAKEFILE_DIR) -e nrf52832_xxaa

    #target for printing all targets help: @echo following targets are available: @echo nrf52832_xxaa

    C_SOURCE_FILE_NAMES = $(notdir $(C_SOURCE_FILES)) CPP_SOURCE_FILE_NAMES = $(notdir $(CPP_SOURCE_FILES)) ASM_SOURCE_FILE_NAMES = $(notdir $(ASM_SOURCE_FILES))

    C_PATHS = $(call remduplicates, $(dir $(C_SOURCE_FILES) ) ) CPP_PATHS = $(call remduplicates, $(dir $(CPP_SOURCE_FILES) ) ) ASM_PATHS = $(call remduplicates, $(dir $(ASM_SOURCE_FILES) ))

    C_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(C_SOURCE_FILE_NAMES:.c=.o) ) CPP_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(CPP_SOURCE_FILE_NAMES:.cpp=.o) ) ASM_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(ASM_SOURCE_FILE_NAMES:.s=.o) )

    vpath %.c $(C_PATHS) vpath %.cpp $(CPP_PATHS) vpath %.s $(ASM_PATHS)

    OBJECTS = $(C_OBJECTS) $(CPP_OBJECTS) $(ASM_OBJECTS)

    nrf52832_xxaa: OUTPUT_FILENAME := nrf52832_xxaa nrf52832_xxaa: LINKER_SCRIPT=uart_gcc_nrf52.ld

    nrf52832_xxaa: $(BUILD_DIRECTORIES) $(OBJECTS) @echo Linking target: $(OUTPUT_FILENAME).out $(NO_ECHO)$(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -lm -o $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(NO_ECHO)$(MAKE) -f $(MAKEFILE_NAME) -C $(MAKEFILE_DIR) -e finalize

    Create build directories

    $(BUILD_DIRECTORIES): echo $(MAKEFILE_NAME) $(MK) $@

    Create objects from C SRC files

    $(OBJECT_DIRECTORY)/%.o: %.c @echo Compiling file: $(notdir $<) $(NO_ECHO)$(CC) $(CFLAGS) $(INC_PATHS) -c -o $@ $<

    Create objects from Cpp SRC files

    $(OBJECT_DIRECTORY)/%.o: %.cpp @echo Compiling file: $(notdir $<) $(NO_ECHO)$(CXX) $(CFLAGS) $(CXXFLAGS) $(INC_PATHS) -c -o $@ $<

    Assemble files

    $(OBJECT_DIRECTORY)/%.o: %.s @echo Assembly file: $(notdir $<) $(NO_ECHO)$(CC) $(ASMFLAGS) $(INC_PATHS) -c -o $@ $<

    Link

    $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out: $(BUILD_DIRECTORIES) $(OBJECTS) @echo Linking target: $(OUTPUT_FILENAME).out $(NO_ECHO)$(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -lm -o $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out

    Create binary .bin file from the .out file

    $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out @echo Preparing: $(OUTPUT_FILENAME).bin $(NO_ECHO)$(OBJCOPY) -O binary $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin

    Create binary .hex file from the .out file

    $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out @echo Preparing: $(OUTPUT_FILENAME).hex $(NO_ECHO)$(OBJCOPY) -O ihex $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex

    finalize: genbin genhex echosize

    genbin: @echo Preparing: $(OUTPUT_FILENAME).bin $(NO_ECHO)$(OBJCOPY) -O binary $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin

    Create binary .hex file from the .out file

    genhex: @echo Preparing: $(OUTPUT_FILENAME).hex $(NO_ECHO)$(OBJCOPY) -O ihex $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex echosize: -@echo '' $(NO_ECHO)$(SIZE) $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out -@echo ''

    clean: $(RM) $(BUILD_DIRECTORIES)

    cleanobj: $(RM) $(BUILD_DIRECTORIES)/*.o flash: nrf52832_xxaa @echo Flashing: $(OUTPUT_BINARY_DIRECTORY)/$<.hex nrfjprog --program $(OUTPUT_BINARY_DIRECTORY)/$<.hex -f nrf52 --chiperase nrfjprog --reset -f nrf52

    Flash softdevice

Related