Makefile和gktmm-3,带有.o错误

时间:2014-02-06 19:59:29

标签: makefile gtkmm

当我尝试使用.o文件编译可执行文件时,我遇到了makefile错误 错误列表:

g++ -g -Wall -o main main.o  `pkg-config --cflags --libs gtkmm-3.0`
main.o: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../lib/crt1.o:(.text+0x0): first defined here
main.o: In function `_fini':
(.fini+0x0): multiple definition of `_fini'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../lib/crti.o:(.fini+0x0): first defined here
main.o:(.rodata+0x0): multiple definition of `_IO_stdin_used'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../lib/crt1.o:(.rodata.cst4+0x0): first defined here
main.o: In function `data_start':
(.data+0x0): multiple definition of `__data_start'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../lib/crt1.o:(.data+0x0): first defined here
main.o: In function `data_start':
(.data+0x8): multiple definition of `__dso_handle'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/crtbegin.o:(.data+0x0): first defined here
main.o: In function `_init':
(.init+0x0): multiple definition of `_init'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../lib/crti.o:(.init+0x0): first defined here
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/crtend.o:(.tm_clone_table+0x0): multiple definition of `__TMC_END__'
main.o:(.data+0x10): first defined here
/usr/bin/ld: error in main.o(.eh_frame); no .eh_frame_hdr table will be created.
collect2: error: ld returned 1 exit status
makefile:12: recipe for target 'main' failed
make: *** [main] Error 1

和makefile是

NAME=main
CFLAGS=-g -Wall -o $(NAME)
LIBFLAGS=`pkg-config --cflags --libs gtkmm-3.0`
SRCS=main.cpp
CC=g++
OBJECTS=$(SRCS:.cpp=.o) 
all: main
main: $(SRCS)
    $(CC) $(CFLAGS) $(OBJECTS) $(LIBFLAGS)
.cpp.o:
        $(CC) $(CFLAGS)  $< -o $@

有人可以解释我的错误吗?我知道这不是最好的makefile。

1 个答案:

答案 0 :(得分:1)

您必须确保在创建目标文件的所有编译行上使用-c标志。如果没有此标志,编译器前端(g++)将创建可执行文件,而不是目标文件。

在您的示例中,后缀规则.cpp.o正在创建名为 main.o的文件,但它实际上将其链接到可执行文件中。如果您运行./main.o,它就可以运行。然后,当您尝试将该可执行文件链接到另一个名为main的可执行文件时,会发生错误。

更改您的规则:

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