[build] C의 빌드 과정_3

·2022년 6월 9일

C-Study

목록 보기
17/21

#2022.06.09

  1. 빌드 과정: 링크단계
  2. 링크 단계가 분리되어 있는 이유
  3. 라이브러리, 정적/동적
  4. 분할 컴파일과 전역 변수

1. 링크 단계 : 링커

  • 입력: 링커는 모든 오브젝트 코드들을 모아다가 '구멍'을 메꾼 뒤 실행파일로 저장 (_add 함수 호출)
  • 처리과정: 선언만 믿고 사용한 함수나 변수가 여전히 구멍으로 남아있다면? (구현을 하지 않았기 때문에)
    • 링커 오류를 뱉을 수도
    • 그 함수나 변수가 없어 실행할 방법이 없기에 경고가 아니고 오류
  • 출력: 최종실행파일 (.exe, .out)

2. 링크 단계가 분리되어있는 이유

  • .c 파일이 많이 있으면 구멍 메꿔주는 일이 매우 복잡함! (수많은 구멍을 컴파일 할 때 마다 메꾸기엔)
    • .c파일 하나 컴파일 할 때마다 모든 함수를 찾아서 구멍을 매꿔줄 수 없음.
  • 여러개의 .c 파일에서 동일한 외부함수를 사용할 경우 최종실행파일에 함수가 중복으로 들어가는 것도 방지!

★ .c 파일 하나씩 따로 컴파일해서 오브젝트 파일로 저장해 두는 방법이 낫다!

  • 나중에 바뀐 .c파일만 컴파일해서 새로운 오브젝트 파일 생성
  • 기존에 있던 오브젝트 파일들과 합쳐서 링크!
  • 훨 빠르고 분리시켜 놓으니 간단해짐

3. 라이브러리, 정적/동적(dll) 라이브러리와 링크

: 라이브러리로도 빌드 가능!

  • 라이브러리란??
    • 함수등을 기계어로 변환 후 파일하나로 저장해 놓은 것
    • 나중에 .c 파일에서 이 기능이 필요할 때 같이 링크해서 쓸 수 있음
    • 라이브러리에는 정적/ 동적 두가지가 있음!


  • 동적 라이브러리의 장점
    • 실행 파일 크기가 작다
    • 여러 실행파일이 동일한 라이브러리를 공유할 수 있다 => (메모리 절약)
    • 여러 실행파일파일이 이름은 같지만 버전이 다른 동적 라이브러를 사용하면 dll지옥을 맛볼 수있음..

4. 분할 컴파일과 전역변수

  • 분할 컴파일!
profile
Hakuna Matata

0개의 댓글