Makefile 规范的';简单项目';生成文件

Makefile 规范的';简单项目';生成文件,makefile,Makefile,您的小型C/C++项目已经到了将所有代码放在一个文件中不再实用的地步。您需要拆分几个组件。因此,您创建一个src/目录,然后。。。你必须写一个真正的Makefile。不仅仅是hello:hello.o。啊哦。。。是$@还是$我从来没有用过CMake,所以我真的不能说什么。我能提供的最好的是我们学校有一个叫做“makemake”的程序,它能自动生成Makefiles——这不是一个非常高级的程序,但它能完成任务。另一方面,它非常容易使用——只需在目录中执行“makemake>Makefile”,您就

您的小型C/C++项目已经到了将所有代码放在一个文件中不再实用的地步。您需要拆分几个组件。因此,您创建一个
src/
目录,然后。。。你必须写一个真正的Makefile。不仅仅是
hello:hello.o
。啊哦。。。是
$@
还是
$我从来没有用过CMake,所以我真的不能说什么。我能提供的最好的是我们学校有一个叫做“makemake”的程序,它能自动生成Makefiles——这不是一个非常高级的程序,但它能完成任务。另一方面,它非常容易使用——只需在目录中执行“makemake>Makefile”,您就有了一个Makefile,它将构建并链接该目录中的所有源文件(C和C++)。好的一面是,如果您添加了更多的文件,您只需再次运行makemake,就有了一个新的makefile。不利的一面是,无法将您所做的任何自定义目标从一个生成的makefile保存到下一个生成的makefile


至于“一刀切”的makefiles,虽然您完全可以做到这一点,但它首先脱离了“make”命令的目的,即跟踪上次修改的文件,从而只重新编译最近更改的文件,或者依赖刚刚更改的头文件(尽管要生成正确的值,可以使用“makeDependen”-)。您可以使用您当前拥有的plus MakeDependen来创建一个自我更新的makefile。

使用自动生成工具。它易于进行更改,并且对开发人员来说负担较小。它只需将源、LDLIB、LDFLAG指定为变量即可。起初,它可能看起来有点奇怪。但随着您对它做的更多,它会成为您的最爱

我会重新考虑你的决定,不要有一个明确的来源列表——我认为从长远来看,这可能会给你带来麻烦。但是如果这是你的决定,这个makefile非常好


%.o
规则中,我会使用
$我会使用cmake。直接维护一个Make文件根本不会在你有两个头文件时进行扩展。自动工具非常庞大,需要太多的步骤。cmake是一个真正的一刀切的工具。我肯定会使用cmake处理超过10个文件的任何东西;它看起来有点像他avy适用于比它小的东西。它出人意料地不重要,而且它确实只做了必要的工作量。在第一次调用之后,您只需继续调用
make
,即使您更改了CMake文件——它计算依赖项的方式非常神奇:-)(是的,它确实创建了一个目录结构,在太小的情况下,你可能会发现太多。)这个问题的重点是什么?“我给你看我的,如果你给我看你的”?你有什么特别的问题吗?@eriktous我正在寻找一个体面的解决方案来解决构建一个满是C文件的目录的问题。我觉得它可以做得比我做的更好。我非常讨厌Autotool。而且,对于一个6文件的项目来说,这是一种过火的做法。我讨厌Autotool,因为大多数时候,我在autotoo中有更多的SLOC在我的程序中,ls生成的文件比SLOC生成的文件要多。这完全是不平衡和荒谬的。为什么这会给我带来麻烦?@nornagon:拥有两个(或更多)不同的可执行文件,它们有一些共同的代码,这通常是很有用的。将非共同的代码解开需要在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/
build/foo.o: bar.h