2013-09-04 3 views
0

편집 : 내 메이크 파일에 대한 링크 포함다른 개체 파일에 의존하는 개체 파일 빌드

다른 원본 파일에 정의 된 많은 기능을 호출하는 주 프로그램이 있습니다. 내가 functionHeader.hcc -c functionSource.c 를 사용하여 내 기능 중 하나가 다른 함수에 의존 할 때 내가하는 데 문제가 cc main.c func1.o func2.o .... -o test.o

내 주요 프로그램을 컴파일하기 전에 오브젝트 파일을 생성하고 있기 때문에 문제가되지 않습니다. 예 : 내 메인 프로그램은 자체 소스 파일에 정의 된 셔플 기능을 호출하고 셔플 기능은 자신의 소스 파일에 정의 된 스왑 기능을 호출합니다.

cc -c shuffle.o을 사용하여 주 프로그램의 shuffle.o 파일을 생성하려고하면 undefined reference to swap 오류가 발생합니다.

cc shuffle.c swap.o에 접속하려고 시도하면 undefined reference to main 오류가 발생합니다. 여기

내가이 고정 가야합니까 어떻게 내 makefile

입니까? 문제를 발견했습니다. insertSort.h 및 shuffle.h 내부에서 선언 된 스왑 함수는 있지만 구현은하지 않았습니다.

+0

왜 컴파일러 줄에 헤더 파일을 포함시키고 있습니까?헤더 파일은'insertionSort.c' 파일의'#include "insertionSort.h"'에 의해 발견되어야합니다 (헤더가 같은 디렉토리에 있거나 올바른 경로 또는 경로 환경을 사용하는 경우). 또한,'swap'이'insertionSort.h'에서 선언 되었습니까? – lurker

+0

아래의 내 대답을 참조하십시오. "undefined reference"는 '-c'를 지정하는 것을 잊어 버렸기 때문에 컴파일러가 링크를 시도합니다 (그리고 main이 누락되었습니다). 그렇지 않으면 기본적으로 실행 파일을 생성하는 방법이 있습니다. InsertionSort.o를 생성하고 연결에 사용하는 명령 줄에 추가하십시오. insertionSort.c를 컴파일 할 때 -c를 사용하면 (명령에 따라) .o 파일을 지정하는 것은 쓸모가 없습니다. –

+0

스왑은 swap.h에서 선언되고 swap.c에서 구현되지 않습니다. swap.h는 insertionSort.c에 #include됩니다. 필자가 읽었던 makefile 튜토리얼은 컴파일러 라인에 나열된 모든 헤더 파일을 가지고 있으며 똑같이했다. –

답변

2

맨 페이지를 살펴보십시오. '-c'는 컴파일러가 오브젝트 파일 (링크하지 않으려는 것)을 생성하도록합니다.

는 다음을 수행합니다

cc -c insertionSort.c  # => gives insertionSort.o 
cc -c -c functionSource.C# => gives functionSource.o 
cc insertionSort.o functionSource.o ...and-so-on... main.c -o test 

헤더 파일을 지정할 필요가 없습니다 - 그것은 도움이되지 않습니다.

은 BTW : 당신이 MOR 이상의 실행 파일이있는 경우, 오히려 유용

  • 의 (a)하게 배울 수있는
  • (b)는 오브젝트 파일과 프로그램이 같은 이름을 지정해야합니다 협약에 충실 th 소스.

예컨대 :

foo.c => foo.o 
bar.c => bar 

등 - 당신은 그림을 얻는다.

1

이것은 make와는 아무런 관련이 없습니다. 입문서 C 프로그래밍에 대한 서적을 구해야하며, 전처리기를 사용하는 방법을 설명하고 컴파일러의 문서를 검토하여 다른 컴파일러 플래그가 무엇인지 이해해야합니다 (예 : -c 플래그를 사용하려는 경우). 당신이하지 않을 때, 그 차이점은 무엇인지).

컴파일 라인에 헤더 파일 (.h 개)을 포함시키는 것은 잘못입니다. 오브젝트 파일 (.o)을 빌드 할 때 소스 파일 (.c) 만 명령 행에 포함시켜야합니다. 지시문을 사용하여 .c 파일에 필요한 헤더를 추가해야합니다 (#include "insertionSort.h"). 함수에 대한 참조가 누락 된 경우 #include 그 함수를 선언하는 헤더 파일은 #include "swap.h"입니다.

+0

-c 플래그는 오브젝트 파일을 생성한다고 가정했습니다. 나는 불행히도 맨 페이지가 말한 것을 대부분 이해하지 못했다. –

+0

"맨 페이지에서 말한 내용의 대부분을 이해하지 못했습니다." => 놀랄 일이 아닙니다. Te 맨 페이지는 정보의 진실 된 부엌 싱크대이지만 유감스럽게도 가장 일반적인 사용 사례로 시작하지 않습니다. –