Canonical'简单项目'makefile

时间:2011-06-28 01:57:37

标签: makefile

您的小型C / C ++项目已经达到了将所有代码都放在一个文件中不再可行的程度。您想要拆分一些组件。所以你创建一个src/目录,然后......你必须编写一个真正的Makefile。超过hello: hello.o的东西。呃哦......是$@还是$<还是$^?废话。你不记得了(我从来没有)。

你有一个“一刀切”的简单Makefile,可以处理简单的源代码树吗?如果是这样,它里面有什么?为什么?我正在寻找最小,最简单的Makefile,它可以很好地编译一个充满C文件的目录,而不必每次添加文件时都要编辑Makefile。这是我到目前为止所做的:

CXX = clang++
CXXFLAGS = ...
LDFLAGS = ...
EXENAME = main

SRCS = $(wildcard src/*.cc)
OBJS = $(patsubst src%.cc,build%.o, $(SRCS))

all: $(EXENAME)

build/%.o: src/%.cc
    @mkdir -p $(dir $@)
    $(CXX) -c -o $@ $^ $(CXXFLAGS)

$(EXENAME): $(OBJS)
    $(CXX) -o $@ $^ $(LDFLAGS) 

clean:
    rm -rf $(EXENAME) build/

此Makefile将.cc目录中的所有src/文件构建到.o目录中的build/文件中,然后将它们链接到父目录。

你会以不同的方式做什么?

3 个答案:

答案 0 :(得分:1)

我会重新考虑你没有明确的来源清单 - 我认为从长远来看这可能会给你带来麻烦。但如果这是你的决定,这个makefile非常好。

%.o规则中,我会使用$<而不是$^,以便稍后您可以添加依赖项,例如

build/foo.o: bar.h

当你准备好了,你可以看看Advanced Auto-Dependency Generation

答案 1 :(得分:0)

我从未使用过CMake,所以我真的不能说出来。我能提供的最好的是我们在学校开设的名为'makemake'的程序,该程序会自动生成Makefile - http://www.cs.rit.edu/~swm/makemake/这不是一个非常高级的程序,但它可以完成工作。从好的方面来说,它非常容易使用 - 只需要'makemake&gt; Makefile'在目录中,你有一个Makefile,它将构建并链接该目录中的所有源文件(C和C ++)。好的一面是,如果您添加了更多文件,只需再次运行makemake,就可以获得新的makefile。在缺点方面,没有办法将你从一个生成的makefile中完成的任何自定义目标保留到下一个。

至于“一个尺寸适合所有”的makefile,虽然你绝对可以做到这一点,但它首先取消了'make'命令的目的 - 即跟踪上次修改时间的文件,以及因此只重新编译最近更改过的文件,或者依赖刚刚更改过的头文件(虽然要生成正确的文件,你可以使用'makedepend' - http://www.x.org/archive/X11R7.5/doc/man/man1/makedepend.1.html)。你可以使用你现在拥有的东西加上makedepend来制作一个自我更新的makefile。

答案 2 :(得分:-1)

使用automake工具。它易于更改,减少开发人员的负担。它就像将SOURCES,LDLIBS,LDFLAGS指定为变量一样简单。起初它可能看起来有点奇怪。但随着你做更多的事情,它成为你的最爱。