You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

核心修改说明

  1. 源文件与目标文件区分:把SOURCES里的.o改成实际的.cpp源文件,让Make知道要编译哪些代码
  2. 目标文件路径统一:所有生成的.o文件都放到obj目录,避免文件混乱
  3. 新增编译规则:明确告诉Make如何从src目录的源文件生成obj目录的目标文件
  4. 清理命令优化:彻底删除所有生成的中间文件和可执行文件

内容的提问来源于stack exchange,提问作者Caroline

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:00:53