2014-02-06 4 views
0

У меня возникают ошибки с Makefile, когда им пытаются собрать исполняемый с .o файлов список ошибок:Makefile и gktmm-3 с .o ошибки

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 [email protected] 

Может кто-нибудь объяснить мои ошибки? Я знаю, что это не лучший make-файл.

ответ

1

Вы должны быть уверены, что используете флаг -c на всех компилируемых строках, которые создают объектные файлы. Без этого флага компилятор front-end (g++) создаст исполняемый файл, а не файл объекта.

В вашем примере правило суффикса .cpp.o создает файл с именем main.o, но это на самом деле связи, что в исполняемый файл. Если вы запустили ./main.o, это сработает. Затем, когда вы пытаетесь связать этот исполняемый файл с другим исполняемым файлом с именем main, возникает плохое состояние.

Изменить правило:

.cpp.o: 
     $(CC) $(CFLAGS) -c -o [email protected] $< 
Смежные вопросы