c - 执行 make 时出错:mingw32-make: *** No rule to make target
问题描述
我必须创建一个 Makefile,它从不同文件夹中的 .c 文件创建单个可执行文件。.c 文件包括来自任何这些文件夹的头文件。根目录有 3 个子目录 x/y、x/z、a,所有这些子目录都有一些 .c 和 .h 文件。我想从根目录编译程序。这些子目录的本质是可以随时添加/删除新的 .c 文件,因此不可能在 Makefile 中硬编码它们的名称。
到目前为止,我已经创建了这个 Makefile
CC = gcc
INCLUDES = -Ix/y -Ix/z -Ia -Ilib/include
LIB = -lp -lq -lr
demo: x/y/*_d.o x/z/*_l.o a/*_m.o
$(CC) $^ $(LIB) -Llib -o b/demo.exe
%_d.o:: x/y/%.c
$(CC) $(INCLUDES) -c $<
%_l.o:: x/z/%.c
$(CC) $(INCLUDES) -c $<
%_m.o:: a/%.c
$(CC) $(INCLUDES) -c $<
我需要一个能够自行处理这种情况的解决方案。此外,如果将单个文件添加到这些文件夹之一,则只应构建其依赖项,而不是重新构建所有 .c 文件。TIA。
解决方案
你大部分时间都在那里。您只需要一个简单的规则即可将 .c 编译为 .o,例如
.co: $(CC) $(包括) -c $<
带有通配符的依赖关系是可以的。
推荐阅读
- matlab - 这是什么排序算法?(matlab中的代码)
- makefile - 生成的先决条件不触发重建
- python - 如何将某些内容插入多个字符串?
- oracle-apex - Oracle APEX:查询 APEX_COLLECTION 时未找到数据
- android - WRAP_CONTENT 不适用于动态创建的视图
- google-app-engine - 来自服务帐户 OIDC 令牌的 IAP:401 Unauthorized
- forms - 聚合物重置参数格式不起作用
- c# - 如何创建 ShareFileClient 而不指定它的大小以便能够将数据流式传输到它?
- linux-mint - 为什么 Vivaldi 在 LinuxMint 20 XFCE 上比 Remmina VNC 歪?
- postman - 使用 newman 在 htmlextra 报告中进行多次迭代