gpt4 book ai didi

c++ - Makefile目录错误

转载 作者:行者123 更新时间:2023-11-28 02:19:09 25 4
gpt4 key购买 nike

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

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

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

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

    汇编消息:

    fatal error :无法创建构建/:权限被拒绝

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

关于c++ - Makefile目录错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33135093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com