一个非常相似的问题,但不是经常提到的问题;我的项目有以下布局(跨平台,因此不同的IDE等)
[Project]
|
|--- codeblocks
| |- obj
|--- src
|--- visual_studio
基本上,我正在尝试获取我的makefile(位于codeblocks目录中),编译src中包含的文件,并将目标文件放入obj目录。
编译方面我可以毫无问题地实现,但我不能为我的生活弄清楚如何告诉make使用这个替代目录作为的默认位置对象文件;之后移动它我可以做,但意味着我每次进行构建时都必须重新编译整个应用程序,这会破坏makefile的对象。
阅读make文档(是的,我先尝试过,并在途中学到了一些额外的东西!),我遇到了一些例子,比如
$(OBJDIR)/%.o: %.c
,但是make无法找到使用它的规则,而且我没有足够的经验来为自己解决这个问题:(
有人能指出我正确的方向或提供一些合适的提示吗?
答案 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)。