C 中的 Makefile 问题 LINUX
Makefile issue in C LINUX
我的文件夹中有以下文件:
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)
显然这行不通。
如何使我的 makefile 工作?并改进它?
编辑:
在main.c中:
#include "file1.h"
在file1.c中:
#include "file1.h"
在file1.h中:
#include "file2.h"
在file2.c中:
#include "file2.h"
我在 file2.h 中没有包含。
我这样做对吗?
只需将 file2.h 添加为 file1.o
的依赖项
应该可以。
我建议使用make
的通配符匹配。为了演示,我在文件中填充了一些简单的函数。
file2.h
void func2(void);
file2.c
#include "file2.h"
void func2()
{
return;
}
file1.h
#include "file2.h"
void func1();
file1.c
#include "file1.h"
void func1()
{
func2();
return;
}
main.c
#include "file1.h"
int main()
{
func1();
return 0;
}
现在,您可以使用 make
的通配符匹配,Ex,*.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)
航站楼Session
$ 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
一般来说,建议单独保存.h
个文件,例如,有includes
个目录。通过该修改,Makefile
变为
生成文件
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)
航站楼Session
$ 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
我的文件夹中有以下文件:
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)
显然这行不通。
如何使我的 makefile 工作?并改进它?
编辑:
在main.c中:
#include "file1.h"
在file1.c中:
#include "file1.h"
在file1.h中:
#include "file2.h"
在file2.c中:
#include "file2.h"
我在 file2.h 中没有包含。
我这样做对吗?
只需将 file2.h 添加为 file1.o
的依赖项应该可以。
我建议使用make
的通配符匹配。为了演示,我在文件中填充了一些简单的函数。
file2.h
void func2(void);
file2.c
#include "file2.h"
void func2()
{
return;
}
file1.h
#include "file2.h"
void func1();
file1.c
#include "file1.h"
void func1()
{
func2();
return;
}
main.c
#include "file1.h"
int main()
{
func1();
return 0;
}
现在,您可以使用 make
的通配符匹配,Ex,*.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)
航站楼Session
$ 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
一般来说,建议单独保存.h
个文件,例如,有includes
个目录。通过该修改,Makefile
变为
生成文件
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)
航站楼Session
$ 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