컴파일은 C언어의 소스코드를 기계어로 변환하는 과정입니다. C는 중간 수준 언어이므로 프로그램이 우리 컴퓨터에서 실행될 수 있도록 실행 가능한 코드로 변환하는 컴파일러가 필요합니다.
C 프로그램은 컴파일 중에 다음 단계를 거칩니다.

C의 컴파일 프로세스
C 프로그램을 어떻게 컴파일하고 실행합니까?
C 프로그램을 컴파일하고 실행하려면 먼저 컴파일러와 코드 편집기가 필요합니다. 아래 예는 GCC 컴파일러를 사용하는 Ubuntu 시스템의 예입니다.
1단계: C 소스 파일 생성
먼저 편집기를 사용하여 C 프로그램을 만들고 파일을 filename.c로 저장합니다.
황소 대 황소
$ vi filename.c>
간단한 hello world 프로그램을 작성하고 저장할 수 있습니다.
2단계: GCC 컴파일러를 사용하여 컴파일
filename.c 소스 파일을 컴파일하기 위해 터미널에서 다음 명령을 사용합니다.
$ gcc filename.c –o filename>
다음과 같은 다양한 작업에 대해 GCC 컴파일러에 많은 명령을 전달할 수 있습니다.
- -Wall 옵션은 모든 컴파일러의 경고 메시지를 활성화합니다. 더 나은 코드를 생성하려면 이 옵션을 권장합니다.
- -o 옵션은 출력 파일 이름을 지정하는 데 사용됩니다. 이 옵션을 사용하지 않으면 이름이 a.out인 출력 파일이 생성됩니다.
C 프로그램에 오류가 없으면 C 프로그램의 실행 파일이 생성됩니다.
자바 비교
3단계: 프로그램 실행
컴파일 실행 파일이 생성된 후 아래 명령을 사용하여 생성된 실행 파일을 실행합니다.
$ ./filename>
프로그램이 실행되고 출력이 터미널에 표시됩니다.
컴파일 과정에는 무엇이 들어가나요?
컴파일러는 C 프로그램을 실행 파일로 변환합니다. C 프로그램이 실행 파일이 되는 데에는 4가지 단계가 있습니다.
- 전처리 컴파일 어셈블리 연결
아래 명령을 실행하면 실행 파일과 함께 현재 디렉터리의 모든 중간 파일을 얻을 수 있습니다.
$gcc -Wall -save-temps filename.c –o filename>
다음 스크린샷은 생성된 모든 중간 파일을 보여줍니다.
int를 문자열로 변환
중간 파일
이러한 중간 파일에 무엇이 포함되어 있는지 하나씩 살펴보겠습니다.
1. 전처리
이는 소스 코드가 전달되는 첫 번째 단계입니다. 이 단계에는 다음이 포함됩니다.
- 댓글 삭제
- 매크로 확장
- 포함된 파일의 확장.
- 조건부 컴파일
전처리된 출력은 파일 이름.i . filename.i 안에 무엇이 있는지 살펴보겠습니다. $vi 파일명.i
위 출력에서 소스 파일은 수많은 정보로 채워져 있지만 결국에는 코드가 보존됩니다.
- printf에는 이제 add(a, b) 대신 a + b가 포함됩니다. 이는 매크로가 확장되었기 때문입니다.
- 댓글이 제거되었습니다. #include가 누락된 대신 많은 코드가 표시됩니다. 따라서 헤더 파일이 확장되어 소스 파일에 포함되었습니다.
2. 컴파일
다음 단계는 filename.i를 컴파일하고 생성하는 것입니다. 중간 컴파일된 출력 파일 파일 이름.s . 이 파일은 어셈블리 수준 지침에 있습니다. 다음을 사용하여 이 파일을 살펴보겠습니다. $nano 파일명.s 터미널 명령.
GB 대 MB
어셈블리 코드 파일
스냅샷은 어셈블러가 이해할 수 있는 어셈블리 언어로 되어 있음을 보여줍니다.
3. 조립
이 단계에서는 filename.s가 입력으로 사용되어 다음으로 변환됩니다. 파일 이름.o 어셈블러에 의해. 이 파일에는 기계 수준 지침이 포함되어 있습니다. 이 단계에서는 기존 코드만 기계어로 변환되고 printf()와 같은 함수 호출은 해결되지 않습니다. 다음을 사용하여 이 파일을 살펴보겠습니다. $vi 파일 이름.o
C 언어의 행렬
바이너리 코드
4. 연결
이것은 함수 호출과 해당 정의의 모든 연결이 완료되는 마지막 단계입니다. 링커는 이러한 모든 기능이 구현되는 위치를 알고 있습니다. 링커는 몇 가지 추가 작업도 수행합니다. 프로그램이 시작하고 끝날 때 필요한 추가 코드를 프로그램에 추가합니다. 예를 들어 명령줄 인수 전달과 같은 환경을 설정하는 데 필요한 코드가 있습니다. 이 작업은 다음을 사용하여 쉽게 확인할 수 있습니다. $size 파일명.o 그리고 $size 파일 이름 . 이러한 명령을 통해 출력 파일이 개체 파일에서 실행 파일로 증가하는 방법을 알 수 있습니다. 이는 링커가 프로그램에 추가하는 추가 코드 때문입니다.
메모: GCC는 기본적으로 동적 연결을 수행하므로 printf()는 위 프로그램에서 동적으로 연결됩니다. 정적 및 동적 연결에 대한 자세한 내용은 이 , 이 및 이 를 참조하십시오.