STM32 + makefileでC++に対応をしてみる(gcc/g++併用編)

2022年2月26日

こんにちは。忘備録として,STM32CubeMXから出力されたmakefileを使用して,gccとg++の両方のコンパイラを用いる方法のmakefileの改造の仕方を書いていきます。
全てをg++でコンパイルをしてしまう方法は以下の記事を参考にしていただければ幸いです。

makefileのコードの右上がcになっているのは気にしないでいただけると助かります(makefileでハイライトがうまくできませんでした)




makefileの改造例

コンパイラの追加

#######################################
# binaries
#######################################
PREFIX = arm-none-eabi-
# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx)
# either it can be added to the PATH environment variable.
ifdef GCC_PATH
CC = $(GCC_PATH)/$(PREFIX)gcc
CXX = $(GCC_PATH)/$(PREFIX)g++
AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp
CP = $(GCC_PATH)/$(PREFIX)objcopy
SZ = $(GCC_PATH)/$(PREFIX)size
else
CC = $(PREFIX)gcc
CXX = $(PREFIX)g++
AS = $(PREFIX)gcc -x assembler-with-cpp
CP = $(PREFIX)objcopy
SZ = $(PREFIX)size
endif
HEX = $(CP) -O ihex
BIN = $(CP) -O binary -S

CXXの変数としてg++を追加しました。

ソースの追加

# CPP sources
CXX_SOURCES = 
CXX_SOURCESにC_SOURCESと同様にしてファイルの追加をしていけばOKです。

インクルードディレクトリやフラグなどの追加

CFLAGSのセクションにCの定義のあとに追加をしていってください。

# C++ defines
CXX_DEFS = $(C_DEFS)
# C++ includes
CXX_INCLUDES = \
$(C_INCLUDES)
# compile g++ flags
CXXFLAGS = $(MCU) $(CXX_DEFS) $(CXX_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections

LDFLAGSの変更

LIBSに-lsstdc++を追加をする。
理由については、以下の記事を参考にしていただければ幸いです。

https://aki-yam.hatenablog.com/entry/20081019/1224386522

大変参考になりました。ありがとうございます。

build the applicationの追加・変更

g++を使用してcppソースのコンパイルルールとg++を使用してリンクするようにさせます。

#######################################
# build the application
#######################################
# list of objects
OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))
vpath %.c $(sort $(dir $(C_SOURCES)))
# list of ASM program objects
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o)))
vpath %.s $(sort $(dir $(ASM_SOURCES)))
# list of c++ objects
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(CXX_SOURCES:.cpp=.o)))
vpath %.cpp $(sort $(dir $(CXX_SOURCES)))

$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR)
  $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@

$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR)
  $(AS) -c $(CFLAGS) $< -o $@

$(BUILD_DIR)/%.o: %.cpp Makefile | $(BUILD_DIR)
  $(CXX) -c $(CXXFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.cpp=.lst)) $< -o $@

$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
  $(CXX) $(OBJECTS) $(LDFLAGS) -o $@
  $(SZ) $@

おわりに

c++で作成したクラスの関数を使用したいときは、extern “C"を使用してラッパー関数を書いて使うことができます。
久々のブログ更新だったので書き方を忘れていたりして大変でした。余裕ができてきたらいろいろとネタはあるので更新していければと思っています。