programing

C 헤더 파일 및 컴파일/링크

kingscode 2022. 7. 10. 18:54
반응형

C 헤더 파일 및 컴파일/링크

한 함수, 은 「포워드 선언」, 「 선언」으로되고 있는 것을 알고 ..c#include 되는 알고 제가 알기로는 권력분립은 다음과 같습니다.

파일: " " " " :func.h

  • 함수의 순방향 선언을 포함합니다.

    int func(int i);
    

파일: C 스 c c일 :func.c

  • 실제 함수 정의 포함

    #include "func.h"
    
    int func(int i) {
        return ++i ;
    }
    

파일C " " " "source.c : ("프로그램")

#include <stdio.h>
#include "func.h"

int main(void) {
    int res = func(3);
    printf("%i", res);
}

가 묻고 싶은 것은, 「」을 있는 입니다.#include로, 「복사」의 ..h「」라고 하는 있습니다.#include요?.c실제로 함수를 실행하는 방법을 알고 있습니까? 수 있는 「무엇이든지」입니다.int func(int i);그럼 실제로 어떻게 기능을 수행할 수 있을까요? 실제 할 수 요?func★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」고고하 하인 포인 ?? ????

어떻게 작동합니까?

우치아 이타치씨가 답을 주었다.링커다.

C 컴파일러 GNU C gcc 을 컴파일합니다.

gcc hello.c -o hello # generating the executable hello

그러나 예에서 설명한 대로 두 개 이상의 파일 프로그램을 컴파일하려면 다음 작업을 수행해야 합니다.

gcc -c func.c # generates the object file func.o
gcc -c main.c # generates the object file main.o
gcc func.o main.o -o main # generates the executable main

각 오브젝트 파일에는 외부 기호가 있습니다(공용 멤버로 간주할 수 있습니다).함수는 기본적으로 외부 변수이고 (글로벌) 변수는 기본적으로 내부 변수입니다.이 동작을 변경하려면

static int func(int i) { # static linkage
    return ++i ;
}

또는

/* global variable accessible from other modules (object files) */
extern int global_variable = 10; 

메인 모듈에서 정의되지 않은 함수에 대한 호출이 발생하면 링커는 착신된 함수가 정의되어 있는 모듈의 입력으로 제공되는 모든 객체파일(및 라이브러리)을 검색합니다.되어 있는 가 몇 개 수 「」를 사용할 수 .printf이미 라이브러리로 컴파일되어 있습니다.

정말 관심이 있다면 조립 프로그래밍을 시도해 보세요.이러한 이름은 어셈블리 코드의 레이블과 동일합니다.

파일에 I external symbol"이라는 특별를 내보냅니다.func.그런 다음 링커는 이를 확인하고 다른 모든 개체 파일과 라이브러리를 검색하여 기호를 찾습니다.

동일한 컴파일 유닛 내에서 정의되지 않은 심볼 선언은 컴파일러에 해당 심볼의 주소를 위한 플레이스 홀더로 오브젝트 파일로 컴파일하도록 지시한다.

링커는 기호에 대한 정의가 필요한 것을 확인하고 라이브러리 및 기타 객체 파일에서 기호의 외부 정의를 찾습니다.

링커가 정의를 찾으면 원래 개체 파일의 자리 표시자가 최종 실행 파일에서 찾은 주소로 바뀝니다.

헤더는 다른 액세스뿐만 아니라.c파일도 같은 프로그램에 포함되지만 바이너리 형식으로 배포될 수 있는 라이브러리에도 마찬가지입니다.한 사람의 관계.c다른 파일에 대한 파일은 다른 파일에 의존하는 라이브러리와 완전히 동일합니다.

구현 형식에 관계없이 프로그래밍 인터페이스는 텍스트 형식이어야 하므로 헤더 파일은 관심사 구분으로서 의미가 있습니다.

다른 사람들이 언급했듯이, 라이브러리와 소스(변환 장치) 사이의 함수 호출과 액세스를 해결하는 프로그램을 링커라고 합니다.

링커는 헤더에서는 동작하지 않습니다.모든 변환 유닛과 라이브러리에 정의되어 있는 모든 이름의 큰 테이블을 만들고, 그 이름을 액세스 하는 코드 행에 링크합니다.C의 오래된 사용법에서는 구현 선언 없이 함수를 호출할 수 있습니다. 정의되지 않은 모든 유형은 C가 v-in-in-in-in-type이라고 가정했을 뿐입니다.int.

일반적으로 다음과 같은 파일을 컴파일할 때:

gcc -o program program.c

정말로 드라이버 프로그램을 호출하고 있습니다.이것에 의해, 다음의 조작을 실시합니다.

  • 전처리(별도의 스텝으로 할 것을 요구하는 경우)를 사용하여cpp.
  • 컴파일(전처리와 통합될 수 있음)cc1
  • ,, " "as(GNU, GNU).
  • , 를 사용한 링크collect2 「」도합니다.ld(GNU 커 ( ().

파일즉, 3단계)을 ..o컴파일 유닛(.c 파일)을 컴파일하여 작성됩니다(#directions 및 기타 디렉티브는 프리프로세서로 대체됩니다).

4단계는 최종 실행 파일을 생성하는 단계입니다.컴파일러는 유닛을 컴파일한 후 링커에 의해 해결되어야 하는 참조로서 여러 개의 코드를 마킹합니다.링커의 역할은 많은 컴파일 유닛을 검색하고 외부 컴파일 유닛에 대한 참조를 해결하는 것입니다.

언급URL : https://stackoverflow.com/questions/18548157/c-header-files-and-compilation-linking

반응형