2009-09-14 7 views
5

그래서 헤더 파일과 소스 파일의 차이점을 알게되었습니다. 필자가 얻지 못하는 것은 컴파일러가 모든 소스 파일을 컴파일하는 방법을 아는 것입니다. 예 :C 소스 파일 포함

example.h

#ifndef EXAMPLE_H 
#define EXAMPLE_H 

int example(int argument); // prototype 

#endif 

example.c

#include "example.h" 

int example(int argument) 
    { 
    return argument + 1; // implementation 
    } 

main.cmain.c를 컴파일하는 컴파일러를 수행하는 방법

#include "example.h" 

main() 
    { 
    int whatever; 
    whatever = example(whatever); // usage in program 
    } 

, example()의 구현을 알고있을 때 아무것도 포함 udes example.c?

프로젝트와 물건에 파일을 추가하는 IDE 일종입니까? 기발한 IDE에 일반 텍스트 편집기를 선호하는 것처럼 "수동으로"할 수있는 방법이 있습니까?

답변

5

예, IDE를 사용하지 않는 경우 메이크 파일을 통해 컴파일러에게 어떤 소스 파일을 오브젝트 파일로 컴파일해야하는지 알려줘야하고 컴파일러가 각각을 개별적으로 컴파일해야합니다. 그런 다음 링커에게 객체 파일 목록을 제공하여 실행 파일에 결합합니다. 링커가 함수 또는 클래스 정의를 찾고 있는데 찾을 수 없으면 링크 오류가 발생합니다.

+0

메이크 파일이 들어있는 곳이기 때문에 항상 어디에 들어 있는지 궁금합니다. 감사합니다. –

0

컴파일러가 아닙니다. 하지만 빌드 툴은 그렇습니다. IDE 또는 make 도구. 수동 방법은 수공예입니다 Makefile s입니다.

4

그건 ... 당신이 말해야합니다. GCC를 사용하여 어디 갔지
예를 들어, 먼저이 파일을 컴파일합니다 :

gcc file1.c -c -ofile1.o 
gcc file2.c -c -ofile2.o 

그리고 컴파일러는 (귀하의 예제 기능 등)에 정의한 기호 존재하고 것을 가정하고, 해당 파일을 컴파일 나중에 연결될 수 있습니다. 은 그럼 당신은 함께 오브젝트 파일을 링크 :이 시점에서

gcc file1.o file2.o -oexecutable 

는 링커가 그 가정 사항을 명확히 살펴보고 "관계를 설명"그 즉. 그들이 있는지 여부를 확인합니다. 그것은 기본적으로 어떻게 작동하는지 이것은 당신의 IDE 질문에 관해서는

는 구글 "메이크"C 또는 C++에서 컴파일

+0

'-S'가 아니라'-c'을 의미합니다. 그렇지 않으면 출력으로'.o'를 사용해서는 안됩니다. –

+0

@hacker 감사합니다. 고정 ... 그것은 당신이 GCC가의 main.c -o main.o를 2 단계 – aviraldg

9

실제로이 별도의 단계로 분할된다 ...입니다.

  • 예를의 구현에 대해 알고하지 않습니다

컴파일러를 연결

  • 컴파일(). 어떤 점에서 정의 될 example()이라는 것이 있다는 것을 알고 있습니다. 예를 들어 자리 표시자를 사용하여 코드를 생성했습니다.

    그러면 링커는 이러한 자리 표시자를 찾아서 해결합니다.

    는 GCC의 처음 2 호출이

    gcc -c example.c -o example.o 
    gcc -c main.c -o main.o 
    gcc example.o main.o -o myProgram 
    

    컴파일 단계 다음은 당신이 할 것 GCC를 사용하여 코드를 컴파일합니다. 세 번째 호출은 링커 단계입니다.

  • +0

    ... 옵션의 긴 페이지를 읽는 데 매우 어렵다. 그것을 잡아 주셔서 감사합니다. 결정된. – baskin

    +0

    @baskin에서, 그래 내가 한 -c 의미 생각 – Glen

    1

    컴파일러는 예제의 구현을 알지 못한다() main.c를 컴파일 할 때 - 컴파일러는 헤더 파일에서 포함 된 서명을 (어떻게 전화를) 알고 있습니다. 컴파일러는 .o 객체 파일을 생성하며이 파일은 나중에 링커에서 링크되어 실행 가능 바이너리를 만듭니다. 빌드 프로세스는 IDE 또는 Makefile을 선호하는 경우 제어 할 수 있습니다. Makefile은 약간의 지식을 이해하는 고유 한 구문을 가지고 있지만 빌드 프로세스를 훨씬 명확하게 만듭니다. Makefile을 검색하면 웹에 좋은 참조가 많이 있습니다.

    관련 문제