2017-11-15 1 views
1

내가 가진메이크 여러 정의 오류 내 메이크에서

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이 구조체에 포함되어있다 자동차 정보 및 연결된 목록에서 작동하는 다양한 기능을 제공하는 dealer.c는 주요 기능이있는 곳입니다.

이것은 메이크 파일을 처음 사용 한 것이지만 특정 기능의 다중 정의에 대한 내용을 이해하는 데 어려움을 겪는 다양한 오류가 발생했습니다. (일부는 실제로 코드에, 일부는 시스템 코드에 깊숙이 맞춰져 있습니다.) 왜 내가이 오류가 발생하는지 모르겠다.

제 목표는 모든 구성 요소를 연결하여 기본 프로그램을 만드는 것입니다.

오류 :

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 

나는 그들이 할 생각 무엇 메이크가 있고 이해하지만이 작업을 얻을 수가 캔트.

+0

gcc -c와 -o는 함께 이해하지 못합니다. -c를 사용하여 .c 파일을 오브젝트 .o 파일로 컴파일하도록 gcc에 지시하십시오. -o는 여러 객체 파일을 실행 파일에 * 링크 *하는 데 사용됩니다. gcc는 여기 혼란스럽고 각 파일을 자신의 실행 파일에 링크하려고합니다. –

+0

'readline :'을'readline.o :'로,'-o readline'을'-o readline.o' 등으로 변경하십시오. –

+1

@LeeDanielCrocker가 틀립니다. '-o '는 출력 파일 이름을 지정하는 것을 의미합니다. '-c'와'-o'를 함께 사용하는 것이 일반적입니다. 'gcc -o foo.obj -c foo.c' –

답변

1

당신의 메이크 파일은 의미가 없습니다. 매우 비 표준 명명 규칙 -

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

그래서 그래서 정말 그냥 "readline.o"입니다, 당신의 목표는 "readline에"입니다,하지만 당신은 -c 사용합니다. 특히 혼란스럽게 설계된가요? 이것은 "readline에" "readline에"같은

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

동일라는 개체 파일 (하지 EXE 파일)을 생성합니다. 이것은 "자동차"

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

심지어 가까운라는 개체 파일 (아닌 EXE) 생성합니다 : "대리점"라는 GCC가 생성되고 객체 파일 (아닌 EXE)을하지만, 목표는 "dealer.o입니다 ". 적어도 이번에는 -c가 제대로 사용되었습니다 - 당신은 ".o"를 만들려고합니다. 단지 -o가 잘못되었다는 것입니다. 대상 (생산되지 않는) dealer.o이기 때문에 당신이 "대리점"을 생성하지 않도록이 항상 dealer.o

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

없음 -o하지 않습니다 헛된 시도 실행, 사용자가 만든 "는 .아웃". car.o, dealer.o 또는 readline.o를 빌드하지 않으므로 아무 것도 유용하지 않습니다. 최소한 -c는 없기 때문에 아마도 이것은 정확한 값에 가깝습니다 ...

+0

내 타겟은 실제 .o 파일이므로 메이크 파일의 타겟이 출력됩니다 빌드 후? – Jude

관련 문제