MPLAB X IDE编译链适配VS Code:xc32配置与Makefile问题求助
在VS Code中用MPLAB扩展编译MPLAB X项目的解决方案
一、先解决VS Code找不到xc32编译器的问题
有两种方式让VS Code识别到你的xc32 v2.40编译器:
- 方式1:添加系统环境变量
把C:/Program Files/Microchip/xc32/v2.40/bin/添加到系统的PATH环境变量里,重启VS Code后就能直接调用xc32-gcc.exe - 方式2:配置VS Code设置
打开VS Code的设置(快捷键Ctrl+,),搜索mchp.mplabx.xc32.path,填入编译器的bin目录路径:"mchp.mplabx.xc32.path": "C:/Program Files/Microchip/xc32/v2.40/bin/"
二、复用MPLAB X的Makefile(最省心,推荐)
不用手动写复杂的编译配置,直接调用MPLAB X自动生成的Makefile,完全和MPLAB X的编译逻辑一致,步骤如下:
- 打开VS Code,加载项目的根目录(即
MY_PROJECT.X所在的文件夹) - 按
Ctrl+Shift+B打开任务面板,选择「创建tasks.json文件」,然后选「Others」模板 - 把生成的tasks.json替换成以下内容:
{ "version": "2.0.0", "tasks": [ { "label": "Build MPLAB Project", "type": "shell", "command": "make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf", "group": { "kind": "build", "isDefault": true }, "problemMatcher": { "owner": "c", "fileLocation": "absolute", "pattern": { "regexp": "^(.*?):(\\d+):(\\d+):\\s+(error|warning):\\s+(.*)$", "file": 1, "line": 2, "column": 3, "severity": 4, "message": 5 } }, "detail": "调用MPLAB X自动生成的Makefile编译项目" } ] } - 保存后,按
Ctrl+Shift+B就能直接编译,所有嵌套Makefile的逻辑、编译器参数都会自动复用,完全不用手动配置
三、关于编译路径中随机数字的说明
build/default/production/_ext/<随机数字>/是MPLAB X的Makefile自动生成的临时目录,用来隔离不同源文件的编译上下文,每次构建会重新生成,属于正常行为。复用Makefile编译的话,这个路径不会影响最终的输出文件(最终文件在dist/default/production/下),完全不用管它。
四、手动配置tasks.json(不推荐,仅作参考)
如果非要自己编写编译命令,需要把MPLAB X输出里的所有编译参数复制过来:
单个C文件编译命令示例
"C:/Program Files/Microchip/xc32/v2.40/bin/xc32-gcc.exe" -g -x c -c -mprocessor=ATSAMRH71F20C -ffunction-sections -fdata-sections -O1 -I"../src/init" -I"../src/config/default/system/dma" -I"../src/config/default" -I"../src/packs/ATSAMRH71F20C_DFP" -I"../src/packs/CMSIS/CMSIS/Core/Include" -I"../src/packs/CMSIS/" -I"../src/third_party/rtos/FreeRTOS/Source/include" -I"../src/third_party/rtos/FreeRTOS/Source/portable/GCC/SAM/CM7" -I"../src/memoryprotection" -I"../src/config/default/peripheral/abcd" -I"../src/packs/ATSAMRH71F20C_DFP/component" -I"../src/config/default/peripheral/rtc" -I"../src/tasks" -I"../src/memoryprotection" -I"../src/realtimeclock" -I"../src/eeprom" -I"../src/config/default/peripheral/mpu" -I"../src/spi" -I"../src/config/default/peripheral/xyz" -I"../src/config/default/peripheral/mnop" -I"../src/config/default/peripheral/supc" -I"../src/rice" -I"../src/config/default/peripheral/qspi" -I"../src/ccc" -I"../src/device" -I"../src/extflash" -Werror -Wall -MP -MMD -MF "build/default/production/_ext/14461671/sys_dma.o.d" -o build/default/production/_ext/14461671/sys_dma.o ../src/config/default/system/dma/sys_dma.c -mdtcm=0x40000 -mitcm=0x20000 -DXPRJ_default=default -mdfp="C:/Users/<my user>/.mchp_packs/Microchip/SAMRH71_DFP/2.1.105/samrh71c" -I "C:/Users/<my user>/.mchp_packs/ARM/CMSIS/5.4.0/CMSIS/Core/Include"
链接生成ELF文件命令示例
"C:/Program Files/Microchip/xc32/v2.40/bin/xc32-gcc.exe" -mprocessor=ATSAMRH71F20C -mno-device-startup-code -o dist/default/production/MY_PROJECT.X.production.elf build/default/production/_ext/14461671/sys_dma.o <其他目标文件路径> build/default/production/_ext/404212886/FreeRTOS_tasks.o build/default/production/_ext/1360937237/main.o -mdtcm=0x40000 -mitcm=0x20000 -DXPRJ_default=default -Wl,--defsym=__MPLAB_BUILD=1,--script="ATSAMRH71F20C.ld",--defsym=_min_heap_size=512,--defsym=_min_stack_size=10240,--gc-sections,-Map="dist/default/production/MY_PROJECT.X.production.map",--report-mem,--memorysummary,dist/default/production/memoryfile.xml,-T,C:/Users/<my user>/<项目路径>/firmware/MY_PROJECT.X/ATSAMRH71F20C.ld -mdfp="C:/Users/<my user>/.mchp_packs/Microchip/SAMRH71_DFP/2.1.105/samrh71c"
这种方式需要维护所有源文件的编译命令,还要处理随机路径的变化,工作量极大,不推荐使用。
内容的提问来源于stack exchange,提问作者spaceKelan
相关产品推荐
相关产品推荐

