而不是我的代码当前具有的平面结构,我想将其组织成子文件夹中包含的模块(如果模块足够大,可能还有子文件夹)。
每个模块都有一个或多个翻译单元,每个翻译单元都会生成一个.o文件。 最终目标是将所有这些目标文件混合到一个静态库中(暂时)。
我使用简单的'make',它已经足够复杂了 是否有一个系统,与手工编写makefile相比,指定的模型自然而然地或者更少的努力? (如果你打算推荐cmake,我需要一些提示,因为我已经尝试过,但是无法找到一个好的解决方案。)
答案 0 :(得分:2)
我当前项目的makefile中的一些释义可能会帮助你使用老式的GNU make:
SOURCEDIR := dir1 dir2/subdir1 dir3 dir4 dir5/subdir1 dir6/subdir1
SOURCES := $(foreach srcdir,$(SOURCEDIR),$(wildcard $(srcdir)/*.c))
OBJECTS := $(patsubst %.c,build/%.o,$(SOURCES))
OBJDIRS := $(addprefix build/,$(SOURCEDIR))
MAKEDEPS := $(patsubst %.c,build/%.d,$(SOURCES))
all: example
$(OBJDIRS):
-mkdir -p $@
build: $(OBJDIRS)
build/%.o : %.c | build
cc -MMD -c -o $@ $<
example: $(OBJECTS)
cc -o $@ $(OBJECTS)
-include $(MAKEDEPS)
本质上,它将指定目录中找到的所有源文件构建到位于build
目录子目录中的目标文件中,该目录位于与其源目录布局相同的层次结构中(如果多个源文件具有相同的内容,则很重要) name)然后将结果链接到可执行文件example
。
作为奖励,通过MAKEDEPS
变量和clang的-MMD
标志生成和包含动态依赖关系。
答案 1 :(得分:0)
这实际上取决于您的目的:构建包通常是针对观众而不是表演者。通常,他们会考虑人们部署的不同环境。我玩'tup',这似乎是一种在编辑后尽快生成可执行文件的方法。 'Premake'似乎在多个平台上拍摄,但我发现指定编译器选项不比Cmake更明智。
看起来好像你找到了一个好的Makefile导师,所以我会留下我的意见。