提问者:小点点

生成文件目录错误


我在makefile中使用这个代码,除了最后一行,所有的都很好。“我的代码”文件夹如下所示:

项目/bin->;对于可执行文件

项目/生成->;对于。o文件

项目/包含->;对于。hpp文件

项目/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)”中。我在这里要做的是:

>

  • $<;包含“src/mysrc.cp”,因此使用$(notdir$<),我得到“mysrc.cp
  • 现在,我想将文件扩展名更改为.o,因此我使用$($(notdir$<):.cpp=.o),并且应该得到“mysrc.o”。但这部分不起作用:

    G++-C src/main.cpp-o build/

    汇编程序消息:

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

    MakeFile:25:目标“build/main.o”的制作方法失败

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

    我使用$(BUILDDIR)获取“build/mysrc.o

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

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


  • 共1个答案

    匿名用户

    $(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 $@