我在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了。我有什么需要改进的地方吗?
$(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 $@