您的小型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/
文件中,然后将它们链接到父目录。
你会以不同的方式做什么?
答案 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指定为变量一样简单。起初它可能看起来有点奇怪。但随着你做更多的事情,它成为你的最爱。