Makefile无法找到对象的规则

时间:2018-04-30 18:11:42

标签: makefile

我的源分布在不同根目录下的多个目录中。我不想了解为什么会出现这种情况的原因,目前我只是想编译它。我已编写Makefile来编译我的代码,但它告诉我它无法找到创建对象(.o)文件的规则。 Makefile的代码如下。我究竟做错了什么?

TARGET=main

ROOT_DIR:=.
BUILD_DIR:=$(ROOT_DIR)/build
OBJ_DIR:=$(BUILD_DIR)/obj
TARGET_DIR:=$(BUILD_DIR)/bin

OBJ:= src/main.o \
    ../src/system.o \
    ../../LTC2947/src/LTC2947.o \
    ../../spi/src/my_spi.o

INC_DIR:=src ../src/ ../../LTC2947/src ../../spi/src/

CFLAGS := -O2 -g -Wall -Wextra -Werror -std=gnu99 -DDEBUG -L$(LIB_DIR)

#====================================================
TARGET_BIN:=$(TARGET_DIR)/$(TARGET)
_INC_DIR:=$(foreach _dir,$(INC_DIR), -I$(_dir))

# absolute paths for object files
_OBJ:=$(foreach _path, $(OBJ), $(abspath $(_path))) 
# prepend $(OBJ_DIR) to the oejct full paths
_OBJ2:=$(patsubst %,$(OBJ_DIR)/%,$(_OBJ))
# Remove double slashes
_OBJ:=$(shell echo $(_OBJ2) | sed 's,//,/,g')
OBJ_DIRS:=$(dir $(_OBJ))

BUILD_DIRS:= $(OBJ_DIRS) $(TARGET_DIR)

_CFLAGS := $(CFLAGS) $(_INC_DIR)

all: create-build-dirs $(TARGET_BIN)

$(TARGET_BIN): $(_OBJ)
    $(CC) -o $@ $^ $(_CFLAGS) $(LIBS)

%.o: %.c
    $(CC) $(_CFLAGS) -c $< -o $@

.PHONY: clean
clean:
    rm -rf $(BUILD_DIR)
    find . -type f \( -name *~ -o -name core \) -exec rm -f {} \;

create-build-dirs:
    mkdir -p $(BUILD_DIRS)

修改

这是生成的错误

没有规则来制作目标/home/user/projects/myproject/spi/src/my_spi.o

1 个答案:

答案 0 :(得分:1)

请提供您正在查看(剪切和粘贴)的确切错误消息,而不是摘要说明。

这里有很多问题,但从根本上说这个规则是:

%.o: %.c
        $(CC) $(_CFLAGS) -c $< -o $@

告诉make如何从文件 PATH .c构建文件 PATH .o。这两个文件中 PATH 的值必须完全相同。在您的环境中(如果您提供了错误消息,它会更清楚),您似乎在$(OBJ_DIR)中为不存在的源文件创建目标文件,因此这些路径无法相同。这意味着您要求make构建目标$(OBJ_DIR)/foo/bar.o,并且make会尝试查找文件$(OBJ_DIR)/foo/bar.c,如果该规则不匹配则会生成。

其他几点说明:

  • 您不需要foreach使用abspath;它需要多个名字。你可以说$(abspath $(OBJ))
  • 您不需要使用sed shell命令将//替换为/;你可以使用$(subst //,/,$(_OBJ2))
  • 由于您创建输出目录的方式,您将无法在此处可靠地使用并行构建;它们可以与想要使用它们的编译行并行创建。