컴파일 과정
프로그래머가 코드를 작성하면 컴파일러는 .exe(실행파일)을 만들어 낸다.
그 과정은 이렇다.

- 코드 작성 : 프로그래머가 c코드를 작성.
- 전처리(Preprocessing) : 전처리기 처리
- 컴파일(Complie) : C컴파일러가 작동하여, C코드를 어셈블리어로 변환
- 어셈블(Assembling) : 어셈블러가 .obj(목적파일)을 생성
- 링킹(Linking) : 링커가 라이브러리의 .obj(목적파일)을 다른 .obj파일과 결합해 실행파일 생성
여기서 볼 구간은 링킹구간이다.
예를 들어, 다음과 같은 간단한 C코드가 있다고 가정해보자.
#include <stdio.h>
int main(void)
{
printf("hello world!\n");
return 0;
}
이 코드에서 stdio.h라는 헤더 파일을 전처리 한다(헤더파일을 현재 파일에 포함시킴).
main.obj파일이 생성되고, 표준라이브러리 파일에 있는 printf.obj파일(printf의 실제 구현)을 main.obj과 결합한다.
이 과정이 끝나면 실행파일(.exe)가 만들어진다.
※주의 : 라이브러리는 코드가 아니다
많은 사람들이 라이브러리를 코드의 집합이라고 생각하지만, 이는 정확하지 않다.
라이브러리는 코드가 아닌, .obj파일들의 집합체이다.
헤더파일에는 이러한 라이브러리 함수의 함수 원형이 적혀있다.
동적 링크 라이브러리(Dynamic Link Library)와 정적 링크 라이브러리(Static Link Library)
라이브러리에는 동적 링크 라이브러리와 정적 링크 라이브러리가 있다.

동적 링크 라이브러리
※프로그램 실행시 필요할 때 외부에서 라이브러리를 가져오는 방식
즉, 컴파일 시점에 라이브러리 함수를 실행파일에 복사하지 않고, 함수의 위치 정보를 이용하여 필요 시에 그 함수를 호출한다.
동적 링크 라이브러리는 다음과 같은 장점이 있다.
- 프로그램 로딩 시간 단축
- 메모리 절약
- 함수 수정시에 DLL만 수정
동적 링크 라이브러리는 외부에서 가져오는 라이브러리를 가져오는 방식이기 때문에, 실행하려면 .dll파일이 있어야만 한다.
정적 링크 라이브러리
※필요한 함수를 프로그램 코드에 붙여, 프로그램 자체에서 참조
위에 제시한 컴파일 과정은 정적 링킹에 해당한다.
링커가 printf.obj파일을 main.obj파일과 결합하는데, 이것은 정적 링크와 같다.
정적 링크 라이브러리는 다음과 같은 장점이 있다.
- 프로그램 실행 후에 빠른 처리시간을 가진다
- 프로그램 실행 파일만 있다면 프로그램을 실행 할 수 있다.
참고 : https://medium.com/@dkwok94/the-linking-process-exposed-static-vs-dynamic-libraries-977e92139b5f
'컴퓨터 공학(Computer Science)' 카테고리의 다른 글
책 - 그래서 컴퓨터는 어떻게 동작하나요? 후기 (3) | 2023.06.19 |
---|---|
버퍼(Buffer)란? (0) | 2023.04.17 |
32비트 컴퓨터, 64비트 컴퓨터란? (6) | 2023.04.09 |