【问题标题】:Working with makefile and subdirectories使用 makefile 和子目录
【发布时间】:2017-03-08 00:22:18
【问题描述】:

我正在尝试弄清楚如何使用 makefile 和子目录。但不幸到现在。我想将所有 .o 文件放在“build”子目录中,所有 .cpp 都应该放在“src”中,可执行文件放在“bin”文件中。

这个makefile是我的尝试:

PROG = prog1
BINPATH = bin/
CC = g++
CPPFLAGS = -Wall -pedantic -ansi -Iinclude
OBJS = main.o calc.o show.o
BUILDPATH = build/
SRCPATH = src/$(PROG):$(BUILDPATH)$(OBJS)
$(CC) -o $(BINPATH)$(PROG) $(BUILDPATH)$(OBJS)
$(BUILDPATH)main.o:
    $(CC) $(CPPFLAGS) -c $(SRCPATH)main.cpp
$(BUILDPATH)cacula.o:calc.h
    $(CC) $(CPPFLAGS) -c $(SRCPATH)calc.cpp
$(BUILDPATH)show.o:show.h
    $(CC) $(CPPFLAGS) -c $(SRCPATH)show.cpp
clean:
    rm -f core $(BINPATH)$(PROG) $(BUILDPATH)$(OBJS)

【问题讨论】:

  • 那些目录存在吗?还是您需要在这个 makefile 中创建它们?
  • 告诉编译器将目标文件放在哪里,如$(CC) $(CPPFLAGS) -c $(SRCPATH)main.cpp -o $(BUILDPATH)main.o。此外,SRCPATH 必须由单个组件组成。

标签: c++ makefile


【解决方案1】:

最直接的问题是您对变量的操作错误。

OBJS = main.o calc.o show.o
BUILDPATH = build/

到目前为止,一切都很好,但 $(BUILDPATH)$(OBJS) 将扩展为 build/main.o calc.o show.o,这不是您想要的。试试这个:

OBJS := main.o calc.o show.o
BUILDPATH := build/
OBJS := $(addprefix $(BUILDPATH), $(OBJS))

然后你可以像这样使用OBJS

$(PROG): $(OBJS)
    $(CC) -o $(BINPATH)$(PROG) $(OBJS)

还有其他几种方法可以改进这个 makefile,但这应该足以让它工作。

【讨论】:

    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 2011-12-23
    • 2021-05-19
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多