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)
”。我在这里要做的是:
- $< 包含“
src/mysrc.cpp
”所以 $(notdir $<)
我得到
“mysrc.cpp
”
现在,我想将文件扩展名更改为.o
,所以我使用$($(notdir $<):.cpp=.o)
,我应该得到“mysrc.o
”。但是这部分不起作用:
g++ -c src/main.cpp -o build/
汇编程序消息:
致命错误:无法创建构建/:权限被拒绝
Makefile:25: 目标 'build/main.o' 的配方失败
make: *** [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 $@
我在 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)
”。我在这里要做的是:
- $< 包含“
src/mysrc.cpp
”所以$(notdir $<)
我得到 “mysrc.cpp
” 现在,我想将文件扩展名更改为
.o
,所以我使用$($(notdir $<):.cpp=.o)
,我应该得到“mysrc.o
”。但是这部分不起作用:g++ -c src/main.cpp -o build/
汇编程序消息:
致命错误:无法创建构建/:权限被拒绝
Makefile:25: 目标 'build/main.o' 的配方失败
make: *** [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 $@