vscode+makefile开发STM32---支持C++开发

vscode+makefile开发STM32—支持C++开发

文章目录

  • vscode+makefile开发STM32---支持C++开发

参考文章:https://zhuanlan.zhihu.com/p/468568448
修改Makefile文件

  1. 增加CXX_SOURCES变量指定C++源文件
CXX_SOURCES = \
APP/app.cpp
  1. 添加CXX变量指定g++编译器
CXX = $(GCC_PATH)/$(PREFIX)g++

CXX = $(PREFIX)g++
  1. 将CFlAGS复制一份改名为CXXFLAGS作为C++编译参数
CXXFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections
CXXFLAGS += -g -gdwarf-2
CXXFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"

  1. LDFLAGS链接参数中增加-specs=nosys.specs参数
LDFLAGS = $(MCU) -specs=nano.specs -specs=nosys.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections

链接选项中必须增加该参数,否则其它编译都正常,在链接的时候也会报错
5. 增加C++的编译方法:

OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(CXX_SOURCES:.cpp=.o)))
vpath %.cpp $(sort $(dir $(CXX_SOURCES)))

$(BUILD_DIR)/%.o: %.cpp Makefile | $(BUILD_DIR) 
	$(CXX) -c $(CXXFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.cpp=.lst)) $< -o $@
  1. 将最终的连接用到的编译器由CC改为CXX
$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
	$(CXX) $(OBJECTS) $(LDFLAGS) -o $@
	$(SZ) $@

这里的CC不修改为CXX可能会出现如下报错

undefined reference to `operator delete(void*, unsigned int)

至此便完成了makefile文件的修改,便可以进行C++文件的编译了。

注意:一般在嵌入式应用C++编程基本都是C++和C进行混编的。C函数和CPP函数一定要区分清楚,同一个函数c编译出来和CPP编译出来的名称是不一样的。
一般来说C对应头文件中可以增加如下预编译指令,指定中间内容按照C格式编译。

#ifdef __cplusplus
extern "C" {
#endif

void Main(void);

#ifdef __cplusplus
}
#endif

你可能感兴趣的:(STM32,vscode,c++,ide)