带有子文件夹和几个.c文件的C makefile(错误ld)

时间:2018-07-24 12:15:45

标签: c

我正在尝试为我的项目创建一个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。

1 个答案:

答案 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(可执行文件)