【问题标题】:Makefile: Compiling from directory to another directoryMakefile:从目录编译到另一个目录
【发布时间】:2013-06-04 17:52:00
【问题描述】:

我正在尝试使用 Makefile 编译位于src/code/*.cpp 中的一堆.cpp 文件,然后编译build/ 中的每个*.o,最后生成带有build/ 中的可执行文件。

我已经阅读了几个我尝试使用的答案,但遇到了我不理解的问题。

CC = g++
FLAGS = -g -c

SOURCEDIR = /src/code
BUILDDIR = build

EXECUTABLE = DesktopSpecificController
SOURCES = $(wildcard src/code/*.cpp)
OBJECTS = $(patsubst src/code/*.cpp,build/%.o,$(SOURCES))

all: dir $(BUILDDIR)/$(EXECUTABLE)

dir:
    mkdir -p $(BUILDDIR)

$(BUILDDIR)/$(EXECUTABLE): $(OBJECTS)
    $(CC) $^ -o $@

$(OBJECTS): $(BUILDDIR)/%.o : $(SOURCEDIR)/%.cpp
    $(CC) $(FLAGS) $< -o $@

clean:
    rm -f $(BUILDDIR)/*o $(BUILDDIR)/$(EXECUTABLE)

我确实收到以下错误,但我不知道为什么:

Makefile:19: target `src/code/main.cpp' doesn't match the target pattern

我还看到,在尝试构建 EXECUTABLE 时,它没有使用 .o 文件,所以我的规则在这里似乎是错误的。

【问题讨论】:

  • 刚刚更新了我的 Makefile。

标签: makefile


【解决方案1】:

您的patsubst 函数错误;你不能使用像* 这样的shell 通配符。你想要:

OBJECTS = $(patsubst $(SOURCEDIR)/%.cpp,$(BUILDDIR)/%.o,$(SOURCES))

此外,您应该在任何地方都使用SOURCEDIRBUILDDIR,而不仅仅是在某些地方(否则会出现不一致)。最后,您的 SOURCEDIR 值是错误的:它不应该以 / 开头,我希望:

SOURCEDIR = src/code

SOURCES = $(wildcard $(SOURCEDIR)/*.cpp)

【讨论】:

  • 非常感谢!您已经解决了我的问题,现在可以使用了 :) 非常感谢!
  • 不客气。不要忘记 SO 应该是您最后的手段之一,您尝试自己解决之后。这里有一些 makefile 调试提示:首先,-p 选项将打印整个 make 数据库,包括所有变量的所有值。此外,在 GNU make 中,您可以使用 $(info ...) 函数打印出变量值等信息。打印这些值会给你一个很好的线索来判断问题出在哪里。
  • 为了澄清MadScientist的建议,例如$(info ...)可以用作$(info $(SOURCES))。可以在感兴趣的变量定义之后立即插入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多