我正在尝试为我的项目创建一个makefile,但它根本无法正常工作。 我具有以下目录结构
projectroot
|
|-----main.c
|
|-----makefile
|
|-----folder1
| |
| |-----Foobar1.c
| |-----Foo1.c
| |-----Bar1.c
| |-----Foobar1.h
|
|-----folder2
| |-----Foo2.c
| |-----Foo2.h
Foo1.c和Bar1.c在Foobar1.c中使用,它们包含在Foobar.h中,如果我在folder1目录中运行它们(Foobar1.c),它也可以工作。
main.c正在使用Foobar1.c和Foo2.c的功能
CC = gcc
CFLAGS = -c -Wall
LIBS = -lm
all: run
run: main.o Foobar1.o Foo2.o
$(CC) main.o Foobar1.o Foo2.o -o run $(LIBS)
main.o: main.c
$(CC) $(CFLAGS) main.c $(LIBS)
Foobar1.o: folder1/Foobar1.c folder1/Foo1.c folder1/Bar1.c
$(CC) $(CFLAGS) folder1/Foobar1.c folder1/Foo1.c folder1/Bar1.c $(LIBS)
Foo2.o: folder2/Foo2.c
$(CC) $(CFLAGS) folder2/Foo2.c $(LIBS)
clean:
rm -rf *o run
我试图在根目录中为整个项目创建一个Makefile,但出现此错误:
gcc -Wall main.c -lm
gcc -Wall folder1/Foobar1.c folder1/Foo1.c folder1/Bar1.c -lm
gcc -Wall folder2/Foo2.c -lm
gcc main.o Foobar1.o Foo2.o -o run -lm
Foobar.o: In function 'Foo1_func1':
Foobar.c: (.text+0x0): multiple definitions of 'Foo1_func1'
main.o:main.c:(.text+0x0): first defined here
Foobar.o: In function 'Bar1_func1':
Foobar.c: (.text+0x6a4): multiple definitions of 'Bar1_func1'
main.o:main.c:(.text+0x6a4): first defined here
Foobar.o: In function 'Bar1_func2':
Foobar.c: (.text+0xed8): multiple definitions of 'Bar1_func2'
main.o:main.c:(.text+0xed8): first defined here
collect2: error: ld returned 1 exit status
makefile:13: recipe for target "run" failed
make: *** [run] error 1
我还尝试为每个子文件夹创建一个makefile,并且在根目录中创建了一个对子makefile确实有效的文件,但是我不知道如何编写为此尝试的根makefile
在folder1中
CC = gcc
CFLAGS = -c -Wall
LIBS = -lm
all: bar
bar: Foobar1.o
$(CC) Foobar1.o -o bar $(LIBS)
Foobar1.o: Foobar1.c Foo1.c Bar1.c
$(CC) $(CFLAGS) Foobar1.c $(LIBS)
clean:
rm -rf *o bar
在folder2
CC = gcc
CFLAGS = -c -Wall
LIBS = -lm
all: foo
foo: Foo2.o
$(CC) Foo2.o -o bar $(LIBS)
Foo2.o: Foo2.c
$(CC) $(CFLAGS) Foo2.c $(LIBS)
clean:
rm -rf *o foo
并在根目录中。这是正确的方法吗?
CC = gcc
CFLAGS = -c -Wall
LIBS = -lm
all:
+$(MAKE) -C folder1
+$(MAKE) -C folder2
run: main.o folder1/Foobar1.o folder2/Foo2.o
$(CC) main.o folder1/Foobar1.o folder2/Foo2.o -o run $(LIBS)
main.o: main.c
$(CC) $(CFLAGS) main.c $(LIBS)
clean:
rm -rf *o run
请帮助,这是我第一次编写makefile。
答案 0 :(得分:0)
您正在运行可执行文件(.o),而无需先编译.c
run: main.o Foobar1.o Foo2.o
$(CC) main.o Foobar1.o Foo2.o -o run $(LIBS)
[...]
在这里,您应该使用* .o,它更安全。
clean:
rm -rf *o run
正确的顺序是: 1-.h(库) 2-.c(代码) 3-.o(可执行文件)