Makefile多个定义错误

时间:2017-11-15 00:58:58

标签: c makefile

在我的makefile中我有

readline: readline.h readline.c
    gcc -c -o readline readline.c
car: car.c car.h readline.h
    gcc -c -o car car.c
dealer.o: dealer.c car.h
    gcc -c -o dealer dealer.c
dealer: car.o dealer.o readline.o
    gcc car.o dealer.o readline.o

readline.h包含一个函数原型,它读取我教授给我们的字符串,readline.c是函数,car.c包含一个带有汽车信息的结构,以及在链表,经销商上运行的各种函数。 c是主要功能所在的位置。

这是我第一次使用makefile,但是我遇到了很多难以理解的错误,说了一些关于某些函数的多重定义的事情(实际上在我的代码中有一些,我想我的代码深入系统)我不知道我不知道为什么我会收到这些错误。

我的目标是通过将所有组件链接在一起来制作主程序。

错误:

gcc car.o dealer.o readline.o
dealer.o: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o:(.text+0x0): first defined here
dealer.o: In function `printList':
(.text+0x4ee): multiple definition of `printList'
car.o:car.c:(.text+0x33a): first defined here
dealer.o: In function `_fini':
(.fini+0x0): multiple definition of `_fini'
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crti.o:(.fini+0x0): first defined here
dealer.o:(.rodata+0x0): multiple definition of `_IO_stdin_used'
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o:(.rodata.cst4+0x0): first defined here
dealer.o: In function `__data_start':
(.data+0x0): multiple definition of `__data_start'
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o:(.data+0x0): first defined here
dealer.o:(.rodata+0x8): multiple definition of `__dso_handle'
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/crtbegin.o:(.rodata+0x0): first defined here
dealer.o: In function `clearList':
(.text+0x5e2): multiple definition of `clearList'
car.o:car.c:(.text+0x42e): first defined here
dealer.o: In function `append_to_list':
(.text+0x1b4): multiple definition of `append_to_list'
car.o:car.c:(.text+0x0): first defined here
dealer.o: In function `find_car':
(.text+0x3db): multiple definition of `find_car'
car.o:car.c:(.text+0x227): first defined here
dealer.o: In function `_init':
(.init+0x0): multiple definition of `_init'
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crti.o:(.init+0x0): first defined here
readline.o: In function `readLine':
readline.c:(.text+0x0): multiple definition of `readLine'
dealer.o:(.text+0x620): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/crtend.o:(.dtors+0x0): multiple definition of `__DTOR_END__'
dealer.o:(.dtors+0x8): first defined here
/usr/bin/ld: error in dealer.o(.eh_frame); no .eh_frame_hdr table will be created.
collect2: ld returned 1 exit status
make: *** [dealer] Error 1

我理解makefile是什么以及他们想要做什么,但我似乎无法让这个工作。

1 个答案:

答案 0 :(得分:1)

你的makefile毫无意义。

readline: readline.h readline.c
    gcc -c -o readline readline.c

所以你的目标是" readline",但你使用-c,所以它真的只是" readline.o" - 非常非标准的命名约定。专门设计混淆?这将生成一个名为" readline"

的目标文件(不是exe)
car: car.c car.h readline.h
    gcc -c -o car car.c

与" readline"相同。这将产生一个名为" car"

的目标文件(不是exe)
dealer.o: dealer.c car.h
    gcc -c -o dealer dealer.c

甚至没有关闭:gcc正在创建和对象文件(不是exe),称为"经销商"但目标是" dealer.o"。至少这次正确使用了-c - 你试图制作一个" .o",它只是-o错了。由于目标是dealer.o(不生产),这将永远是徒劳无功的经销商.o

dealer: car.o dealer.o readline.o
    gcc car.o dealer.o readline.o

没有-o,所以你不能创建"经销商",你创建" a.out"。什么都没有建立car.o,dealer.o或readline.o所以它永远不会创造任何有用的东西。至少没有-c所以这可能更接近正确......