Makefile目录错误

Makefile directories error

我在 makefile 中使用这段代码,一切正常,但最后一行除外。 我的代码文件夹如下所示:

Project/bin -> 对于可执行文件

Project/build -> 对于 .o 文件

Project/include -> 对于 .hpp 文件

Project/src -> 对于 .cpp 文件

Makefile 路径:Project/Makefile

# Compiler #
CC       = g++
DEBUG    = -g
LFLAGS   =
CFLAGS   = -Wall

# Directories #
SRCDIR   = src/
INCDIR   = include/
BUILDDIR = build/
BINDIR   = bin/

# Objects #
OBJ_NAMES = main.o dfa.o dfaException.o state.o
OBJS       = $(addprefix $(BUILDDIR), $(OBJ_NAMES))

# Output #
TARGET = $(BINDIR)pract3

$(TARGET): $(OBJS)
    $(CC) $(CCFLAGS) $(LFLAGS) $(OBJS) -o $(TARGET)

$(BUILDDIR)%.o: $(SRCDIR)%.cpp
    $(CC) $(CCFLAGS)  $(LFLAGS) -c $< -o $(BUILDDIR)$($(notdir  $<):.cpp=.o)

问题出在“$(BUILDDIR)$($(notdir $<):.cpp=.o)”。我在这里要做的是:

  1. $< 包含“src/mysrc.cpp”所以 $(notdir $<) 我得到 “mysrc.cpp
  2. 现在,我想将文件扩展名更改为.o,所以我使用$($(notdir $<):.cpp=.o),我应该得到“mysrc.o”。但是这部分不起作用:

    g++ -c src/main.cpp -o build/

    汇编程序消息:

    致命错误:无法创建构建/:权限被拒绝

    Makefile:25: 目标 'build/main.o' 的配方失败

    make: *** [build/main.o] 错误 1

  3. 我用$(BUILDDIR)得到“build/mysrc.o

为什么 $($(notdir $<):.cpp=.o) 以某种方式删除文件名?

现在我在这里。几天前我学会了使用 make 。这里有什么我应该改进的地方吗?

$(notdir) 对字符串进行操作。

$(X:Y=Z)X 变量的 进行运算。

因此,当 $<src/mysrc.cpp

时,请遵循您的扩展
$($(notdir  $<):.cpp=.o)

变成

$(mysrc.cpp:.cpp=.o)

你会这样写吗?

不,你会写 $(<:.cpp=.o)

所以反转你的操作。

 $(notdir  $(<:.cpp=.o))

或者,甚至比仅使用 $@ 更好更简单,因为这是您正在构建的目标以及您想要创建的内容。

$(CC) $(CCFLAGS)  $(LFLAGS) -c $< -o $@