vscode+makefile开发STM32—支持C++开发
参考文章:https://zhuanlan.zhihu.com/p/468568448
修改Makefile文件
- 增加CXX_SOURCES变量指定C++源文件
CXX_SOURCES = \
APP/app.cpp
- 添加CXX变量指定g++编译器
CXX = $(GCC_PATH)/$(PREFIX)g++
CXX = $(PREFIX)g++
- 将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)"
- 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 $@
- 将最终的连接用到的编译器由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