如何编写单个makefile,c文件在src和h文件是否在inc文件夹中?

San*_*San 2 c makefile gnu-make

我正在尝试编写一个makefile,它应该从src /中选择来自inc /的头文件

〜/ Linuz/src:1.c,2.c,3.c ......

〜/ Linuz/inc:abc.h,dyz.h

请帮我创建一个应该可用的makefile

〜/ Linuz/some_other_dir /生成文件

PS:尝试为我的linux机器编译它.

谢谢你的建议.

MOH*_*MED 5

all: my_program

%.o: ../src/%.c
    $(CC) $(CFLAGS) -I../inc/ -c -o $@ $^

my_program: 1.o 2.o 3.o 
    $(CC) $(LDFLAGS) -o $@ $^

clean:
    rm -f *.o my_program
Run Code Online (Sandbox Code Playgroud)

如果将Makefile放在〜/ Linuz/some_other_dir /中,则遵循以下规则

%.o: ../src/%.c
Run Code Online (Sandbox Code Playgroud)

将从文件../src/夹(〜/ Linuz/src /)中获取c文件,并在Makefile的同一文件夹中创建对象(*.o)文件.

-I../inc/选项意味着makefile可以从../inc/文件夹(〜/ Linuz/inc /)获取头文件.

my_program: 1.o 2.o 3.o规则意味着makefile将从目标文件1.o2.o和创建Makefile的同一目录中的二进制文件3.o

制作手册:

$ ^ 所有先决条件的名称,它们之间有空格.对于作为存档成员的先决条件,仅使用名为的成员(请参阅存档).无论每个文件作为先决条件列出多少次,目标在其依赖的每个其他文件上只有一个先决条件.因此,如果您为目标多次列出先决条件,则$ ^的值仅包含该名称的一个副本.此列表不包含任何仅限订单的先决条件; 对于那些看到'$ |' 变量,下面.

$ @ 规则目标的文件名.如果目标是归档成员,则'$ @'是归档文件的名称.在具有多个目标的模式规则中(请参阅模式规则简介),'$ @'是导致规则配方运行的任何目标的名称.