1

而不是我的代码当前具有的平面结构,我想将它组织成包含在子文件夹中的模块(如果模块足够大,可能还有子文件夹)。

每个模块将有一个或多个翻译单元,每个翻译单元将生成一个 .o 文件。最终目标是将所有这些目标文件混搭到一个静态库中(目前)。

我正在使用普通的“make”,它已经足够复杂了。
与手动编写 makefile 相比,是否有一个系统可以自然生成指定模型或省力得多?(如果您要推荐 cmake,我需要一些提示,因为我已经尝试过但无法提出一个好的解决方案。)

4

2 回答 2

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与源目录布局平行的层次结构中的目录子目录中的目标文件(如果多个源文件具有相同名称,则很重要),然后将结果链接到一个可执行文件example

作为奖励,动态依赖生成和包含通过MAKEDEPS变量和 clang 的-MMD标志。

于 2013-06-18T22:21:55.020 回答
0

这真的取决于你的目的:构建包通常是为观众而不是表演者准备的。通常,他们会考虑人们部署到的不同环境。我玩弄了“tup”,这似乎更像是在编辑后尽快生成可执行文件的一种方式。'Premake' 似乎可以在多个平台上拍摄,但我发现指定编译器选项并不比使用 Cmake 更明智。

看起来你已经找到了一个很好的 Makefile 导师,所以我将把我的观察留在那里。

于 2013-06-19T18:07:21.410 回答