如何解决Makefile报错“No rule to make target”?PEAT-DOS-TEM编译问题
PEAT-DOS-TEM Makefile 报错解决方案(No rule to make target 'obj/TEM.o')
问题原因
- Makefile要求生成
obj/TEM.o文件,但没定义如何从源代码生成这个文件 - 原有编译规则仅处理当前目录的代码,不会读取
src目录下的源文件,也不会将生成的文件放到obj文件夹 - SOURCES和OBJECTS的定义混乱,把目标文件(.o)当成了源文件(.cpp)
新手友好修复步骤
步骤1:创建必要的文件夹
先手动创建存放中间文件的obj目录(如果不存在):
mkdir -p obj mkdir -p obj/atmosphere
注:-p参数表示如果目录不存在就创建,同时自动创建嵌套的子目录
步骤2:替换Makefile内容
把你当前的Makefile全部替换成以下内容:
CC=g++ CFLAGS= -c -Wall -ansi -O0 -g -fPIC LIBS=-lnetcdf_c++ -lnetcdf LIBDIR=-Lnetcdf/libs INCLUDES=-Inetcdf/includes # 修正:SOURCES填写实际的.cpp源文件路径,而非.o目标文件 SOURCES= src/TEM.cpp \ src/atmosphere/AtmosUtil.cpp \ # 修正:OBJECTS指定生成的.o文件路径,统一放到obj目录下 OBJECTS= obj/TEM.o\ obj/atmosphere/AtmosUtil.o \ GIT_SHA := $(shell git describe --abbrev=6 --dirty --always --tags) TEMOBJ= obj/TEM.o dos-tem: $(OBJECTS) # 修正:链接时使用obj目录下的所有目标文件 $(CC) -o peat-dos-tem $(OBJECTS) $(LIBDIR) $(LIBS) lib: $(OBJECTS) $(CC) -o libDOSTEM.so -shared $(INCLUDES) $(OBJECTS) $(LIBDIR) $(LIBS) # 新增规则:告诉Make如何从src目录的.cpp生成obj目录的.o obj/%.o: src/%.cpp $(CC) $(CFLAGS) $(INCLUDES) $< -o $@ # 新增规则:处理atmosphere子目录下的源文件 obj/atmosphere/%.o: src/atmosphere/%.cpp $(CC) $(CFLAGS) $(INCLUDES) $< -o $@ clean: # 修正:清理obj目录和所有生成的文件 rm -rf obj peat-dos-tem libDOSTEM.so* *~
步骤3:重新执行编译命令
回到终端执行编译:
make
如果之前有残留的错误文件,先清理再编译:
make clean make
核心修改说明
- 源文件与目标文件区分:把SOURCES里的
.o改成实际的.cpp源文件,让Make知道要编译哪些代码 - 目标文件路径统一:所有生成的
.o文件都放到obj目录,避免文件混乱 - 新增编译规则:明确告诉Make如何从
src目录的源文件生成obj目录的目标文件 - 清理命令优化:彻底删除所有生成的中间文件和可执行文件
内容的提问来源于stack exchange,提问作者Caroline
相关产品推荐
相关产品推荐

