C-LINUX中的Makefile问题

C-LINUX中的Makefile问题,c,linux,makefile,dependencies,C,Linux,Makefile,Dependencies,我的文件夹中有以下文件: main.c | file1.c | file1.h | file2.c | file2.h main.c依赖于file1.h和file2.h。 然而,file1.c也依赖于file2.h,这是我的问题 以下是我所拥有的: CC = gcc CFLAGS = -Wall -g BIN = main all: $(BIN) main: main.o file1.o file2.o $(CC) -o $@ $^ main.o: main.c file1.

我的文件夹中有以下文件:

main.c | file1.c | file1.h | file2.c | file2.h

main.c依赖于file1.h和file2.h。 然而,file1.c也依赖于file2.h,这是我的问题

以下是我所拥有的:

CC = gcc
CFLAGS = -Wall -g

BIN = main


all: $(BIN)


main: main.o file1.o file2.o
    $(CC) -o $@ $^

main.o: main.c file1.h
    $(CC) $(CFLAGS) -c -o $@ $<

file1.o: file1.c file1.h
    $(CC) $(CFLAGS) -c -o $@ $<

file2.o: file1.c file1.h
    $(CC) $(CFLAGS) -c -o $@ $<

clean:
    rm -f *.o $(BIN)
在文件1.c中:

#include "file1.h"
在文件1.h中:

#include "file2.h"
在文件2.c中:

#include "file2.h"
我没有包含在文件2.h中


我这样做对吗?

只需添加file2.h作为file1.o的依赖项


它应该可以工作。

我建议使用
进行
的通配符匹配。为了演示,我用一些简单的函数填充了这些文件

文件2.h

void func2(void);
文件2.c

#include "file2.h"

void func2()
{
        return;
}
文件1.h

#include "file2.h"

void func1();
文件1.c

#include "file1.h"

void func1()
{
        func2();
        return;
}
main.c

#include "file1.h"

int main()
{
        func1();
        return 0;
}
现在,您可以使用
make
的通配符匹配,例如,
*.o:.c
从任何
.c
文件生成
.o
文件

生成文件

CC = gcc
CFLAGS = -Wall -g
OBJS = main.o file1.o file2.o
BIN = main

all : $(BIN)

main: $(OBJS)
        $(CC) $(CFLAGS) -o $@ $^

*.o : *.c
        $(CC) $(CFLAGS) -c -o $@ $^
clean:
        rm -f *.o $(BIN)
CC = gcc
CFLAGS = -Wall -g -I./includes
OBJS = main.o file1.o file2.o

main: $(OBJS)
        $(CC) $(CFLAGS) -o $@ $^

*.o : *.c
        $(CC) $(CFLAGS) -c -o $@ $^
clean:
        rm -f *.o $(BIN)
终端会话

$ ls 
file1.c  file1.h  file2.c  file2.h  main.c  Makefile
$ make 
gcc -Wall -g   -c -o main.o main.c
gcc -Wall -g   -c -o file1.o file1.c
gcc -Wall -g   -c -o file2.o file2.c
gcc -Wall -g -o main main.o file1.o file2.o
$ ./main
$ make clean 
rm -f *.o main
$ ls 
file1.c  file1.h  file2.c  file2.h  main.c  Makefile
$ ls 
file1.c  file2.c  includes  main.c  Makefile
$ ls includes/
file1.h  file2.h
$ make 
gcc -Wall -g -I./includes   -c -o main.o main.c
gcc -Wall -g -I./includes   -c -o file1.o file1.c
gcc -Wall -g -I./includes   -c -o file2.o file2.c
gcc -Wall -g -I./includes -o main main.o file1.o file2.o
$ ./main 
$ make clean 
rm -f *.o main
$ ls
file1.c  file2.c  includes  main.c  Makefile
一般来说,建议单独保存
.h
文件,例如,拥有
包含
目录。通过该修改,
Makefile
变为

生成文件

CC = gcc
CFLAGS = -Wall -g
OBJS = main.o file1.o file2.o
BIN = main

all : $(BIN)

main: $(OBJS)
        $(CC) $(CFLAGS) -o $@ $^

*.o : *.c
        $(CC) $(CFLAGS) -c -o $@ $^
clean:
        rm -f *.o $(BIN)
CC = gcc
CFLAGS = -Wall -g -I./includes
OBJS = main.o file1.o file2.o

main: $(OBJS)
        $(CC) $(CFLAGS) -o $@ $^

*.o : *.c
        $(CC) $(CFLAGS) -c -o $@ $^
clean:
        rm -f *.o $(BIN)
终端会话

$ ls 
file1.c  file1.h  file2.c  file2.h  main.c  Makefile
$ make 
gcc -Wall -g   -c -o main.o main.c
gcc -Wall -g   -c -o file1.o file1.c
gcc -Wall -g   -c -o file2.o file2.c
gcc -Wall -g -o main main.o file1.o file2.o
$ ./main
$ make clean 
rm -f *.o main
$ ls 
file1.c  file1.h  file2.c  file2.h  main.c  Makefile
$ ls 
file1.c  file2.c  includes  main.c  Makefile
$ ls includes/
file1.h  file2.h
$ make 
gcc -Wall -g -I./includes   -c -o main.o main.c
gcc -Wall -g -I./includes   -c -o file1.o file1.c
gcc -Wall -g -I./includes   -c -o file2.o file2.c
gcc -Wall -g -I./includes -o main main.o file1.o file2.o
$ ./main 
$ make clean 
rm -f *.o main
$ ls
file1.c  file2.c  includes  main.c  Makefile

这就是为什么我使用
automake
,不必担心这类东西。如果“main.c依赖于file1.h和file2.h”,那么
main.o:main.c
行应该是
main.o:main.c file1.h file2.h
。(请注意,它是main.o,而不是main.c,这取决于file1.h和file2.h。除非当file1.h或file2.h更改时main.c的内容必须更改。)除此之外,您为什么说“显然这不起作用”?是的,就是这样。谢谢。这帮了大忙。谢谢您的时间。@Alcachofra因为您是新加入社区的,请刷新此链接,