makefile在非标准目录布局中

时间:2011-08-14 17:41:21

标签: c makefile

一个非常相似的问题,但不是经常提到的问题;我的项目有以下布局(跨平台,因此不同的IDE等)

[Project]
   |
   |--- codeblocks
   |       |- obj
   |--- src
   |--- visual_studio

基本上,我正在尝试获取我的makefile(位于codeblocks目录中),编译src中包含的文件,并将目标文件放入obj目录。

编译方面我可以毫无问题地实现,但我不能为我的生活弄清楚如何告诉make使用这个替代目录作为默认位置对象文件;之后移动它我可以做,但意味着我每次进行构建时都必须重新编译整个应用程序,这会破坏makefile的对象。

阅读make文档(是的,我先尝试过,并在途中学到了一些额外的东西!),我遇到了一些例子,比如 $(OBJDIR)/%.o: %.c,但是make无法找到使用它的规则,而且我没有足够的经验来为自己解决这个问题:(

有人能指出我正确的方向或提供一些合适的提示吗?

2 个答案:

答案 0 :(得分:1)

这是一个简单的示例Makefile,演示如何执行此操作。

SOURCES = $(wildcard src/*.c)
OBJECTS = $(SOURCES:src/%.c=obj/%.o)

obj/%.o: src/%.c
        $(CC) $(CFLAGS) -c -o $@ $<

target.exe: $(OBJECTS)
        $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS)

Makefile所需的目录结构和文件是:

project/
project/Makefile
project/src/*.c
project/obj

我在我的机器上对此进行了测试并且运行正常:

$ make
cc  -c -o obj/main.o src/main.c
cc -o target.exe obj/main.o  

答案 1 :(得分:0)

如果您使用的是GNU make,则可以使用您描述的扩展模式规则。然后你可以有一个规则

$(OBJDIR)/%.o: $(SRCDIR)/%.c
        $(CC) $(CFLAGS) -c -o $@ $^

编译源文件。另外一个复杂因素是您链接规则需求还为所有目标文件指定$(OBJDIR)。你可以使用像

这样的东西
SOURCES = $(wildcard $(SRCDIR)/*.c)
OBJECTS = $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)

$(TARGET): $(OBJECTS)
        $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS)

或者,您可以使用VPATH来避免在所有这些地方使用$(SRCDIR)。