Makefile编译报错:gcc提示‘no input files’问题求助
问题排查与修复:Makefile链接阶段无输入文件错误
错误现象
执行make时出现以下错误:
gcc -Wall -ansi -pedantic -std=c90 -o bin/openu-assembler gcc: fatal error: no input files compilation terminated. make: *** [Makefile:30: bin/openu-assembler] Error 1
原因分析
- 链接命令使用未定义变量:生成可执行文件的规则中,你使用了未定义的
$(OBJ)变量,导致gcc命令没有接收到任何目标文件(.o)作为输入参数。 - 源文件目录配置不匹配:你提到“源文件存放在bin目录中”,但Makefile中
SRC_FOLDER = src,这会导致$(wildcard $(SRC_FOLDER)/*.c)无法匹配到源文件——不过你说obj目录已生成文件,可能是表述笔误,若源文件实际在src目录则此点可忽略。
修复方案
1. 修正Makefile的链接规则
将生成可执行文件的命令中的$(OBJ)替换为自动变量$^,$^会自动指代当前目标的所有依赖项(即所有编译好的.o文件)。
修复后的关键规则:
# create the executable file, all object files must be created first $(EXECUTABLE): $(SOURCE_FILES:$(SRC_FOLDER)/%.c=$(OBJ_FOLDER)/%.o) $(CC) $(C_FLAGS) $^ -o $@
2. 确认源文件目录匹配
如果源文件确实存放在bin目录,需要修改Makefile中的SRC_FOLDER定义:
# folders SRC_FOLDER = bin # 改为实际的源文件目录 OBJ_FOLDER = obj BIN_FOLDER = bin
完整修复后的Makefile
# Set the compiler and flags CC = gcc C_VERSION = c90 C_FLAGS = -Wall -ansi -pedantic -std=$(C_VERSION) # project name PROJECT_NAME = openu-assembler # folders SRC_FOLDER = src # 根据实际源文件目录调整 OBJ_FOLDER = obj BIN_FOLDER = bin # object files SOURCE_FILES = $(wildcard $(SRC_FOLDER)/*.c) # the executable file EXECUTABLE = $(BIN_FOLDER)/$(PROJECT_NAME) # run the project run: $(EXECUTABLE) ./$(EXECUTABLE) # compile and run compile: clean $(EXECUTABLE) ./$(EXECUTABLE) # create the executable file, all object files must be created first $(EXECUTABLE): $(SOURCE_FILES:$(SRC_FOLDER)/%.c=$(OBJ_FOLDER)/%.o) $(CC) $(C_FLAGS) $^ -o $@ # for each source file, create an object file $(OBJ_FOLDER)/%.o: $(SRC_FOLDER)/%.c $(CC) $(C_FLAGS) -c $< -o $@ # clean the project clean: rm -f $(OBJ_FOLDER)/*.o rm -f $(BIN_FOLDER)/$(PROJECT_NAME)
验证
执行make clean清理旧文件,再执行make,即可正常编译链接生成可执行文件。
内容的提问来源于stack exchange,提问作者Eli Feinshtein
相关产品推荐
相关产品推荐

