VS Code中Makefile Tools扩展构建C项目失败求助
VS Code Makefile Tools扩展构建失败,手动make正常的解决方法
问题场景
- 在VS Code中使用Makefile构建C项目,搭配Microsoft官方Makefile Tools扩展
- 终端手动执行
make all可正常完成构建,生成所有目标可执行文件 - 使用扩展执行「Build current target」时失败,错误输出:
c-krit/ferox: Using: 'cc' to build all examples.
make: *** No rule to make target 'src/basic.out', needed by 'build'. Stop.
终端进程「/usr/bin/bash '-c', ''make' 'all' '-f' '/home/abhishek/Desktop/ferox_examples/examples/Makefile''」启动失败(退出码:2)
相关Makefile代码
.PHONY: all clean .SUFFIXES: .c .exe .html .out _COLOR_BEGIN = \\033\[1;36m _COLOR_END = \\033\[m PROJECT_NAME = ferox PROJECT_FULL_NAME = c-krit/ferox PROJECT_PREFIX = ${_COLOR_BEGIN}${PROJECT_FULL_NAME}:${_COLOR_END} RAYLIB_INCLUDE_PATH ?= /usr/local/lib RAYLIB_LIBRARY_PATH ?= /usr/local/include INCLUDE_PATH = include LIBRARY_PATH = ../lib SOURCE_PATH = src TARGETS ?= \ ${SOURCE_PATH}/basic.out \ ${SOURCE_PATH}/cows.out \ ${SOURCE_PATH}/melon.out \ ${SOURCE_PATH}/query.out \ ${SOURCE_PATH}/raycast.out \ ${SOURCE_PATH}/raylib.out CC = cc CFLAGS = -D_DEFAULT_SOURCE -g -I${INCLUDE_PATH} -I../${INCLUDE_PATH} \ -I${RAYLIB_INCLUDE_PATH} -O2 -std=gnu99 LDFLAGS = -L${LIBRARY_PATH} -L${RAYLIB_LIBRARY_PATH} LDLIBS = -lferox -lraylib -ldl -lGL -lm -lpthread -lrt -lX11 all: pre-build build post-build pre-build: @printf "${PROJECT_PREFIX} Using: '${CC}' to build all examples.\\n" build: ${TARGETS} .c.exe .c.out: @printf "${PROJECT_PREFIX} Compiling: $@ (from $<)\\n" @${CC} $< -o $@ ${CFLAGS} ${LDFLAGS} ${LDLIBS} .c.html: @printf "${PROJECT_PREFIX} Compiling: $@ (from $<)\\n" @${CC} $< -o $@ ${CFLAGS} ${LDFLAGS} ${LDLIBS} ${WEBFLAGS} post-build: @printf "${PROJECT_PREFIX} Build complete.\\n" clean: @printf "${PROJECT_PREFIX} Cleaning up.\\n" @rm -f ${SOURCE_PATH}/*.data ${SOURCE_PATH}/*.exe ${SOURCE_PATH}/*.js \ ${SOURCE_PATH}/*.html ${SOURCE_PATH}/*.out ${SOURCE_PATH}/*.wasm
原因分析
核心问题是Makefile Tools扩展的工作目录与手动执行make的目录不一致,或者后缀规则在扩展的执行环境中匹配失效:
- 手动执行时,当前工作目录是Makefile所在的
/home/abhishek/Desktop/ferox_examples/examples/,src/basic.c路径有效,后缀规则.c.out能正确匹配源文件和目标文件 - 扩展执行时,可能默认工作目录不是Makefile所在目录,导致make找不到
src/basic.c,进而认为没有生成src/basic.out的规则
解决方案
1. 配置扩展的工作目录
打开VS Code设置,搜索Makefile Tools: Working Directory,将其设置为Makefile所在的绝对路径:
/home/abhishek/Desktop/ferox_examples/examples/
确保扩展执行make时的工作目录与手动执行完全一致
2. 替换后缀规则为显式模式规则
后缀规则的兼容性较差,改成显式的模式规则能避免匹配问题。将原Makefile中的.c.exe .c.out:规则替换为:
${SOURCE_PATH}/%.out: ${SOURCE_PATH}/%.c @printf "${PROJECT_PREFIX} Compiling: $@ (from $<)\\n" @${CC} $< -o $@ ${CFLAGS} ${LDFLAGS} ${LDLIBS} ${SOURCE_PATH}/%.exe: ${SOURCE_PATH}/%.c @printf "${PROJECT_PREFIX} Compiling: $@ (from $<)\\n" @${CC} $< -o $@ ${CFLAGS} ${LDFLAGS} ${LDLIBS}
显式指定源文件与目标文件的对应关系,消除后缀规则的不确定性
3. 调试路径变量(可选)
在pre-build步骤中添加路径打印,验证扩展执行环境的目录和变量是否正确:
pre-build: @printf "${PROJECT_PREFIX} Using: '${CC}' to build all examples.\\n" @printf "${PROJECT_PREFIX} Source path: ${SOURCE_PATH}\\n" @printf "${PROJECT_PREFIX} Current working directory: $(shell pwd)\\n"
执行扩展构建后查看输出,确认当前目录是否为Makefile所在目录,SOURCE_PATH是否正确解析
内容的提问来源于stack exchange,提问作者Abhishek G.Y
相关产品推荐
相关产品推荐

