티스토리 뷰

iOS 앱을 개발하다 보면 Xcode에서 빌드를 수행하는 과정이 어떻게 진행되는지 궁금할 때가 있다.
빌드 속도가 느려질 때 최적화하는 방법을 찾거나, 빌드 오류가 발생했을 때 원인을 정확히 파악하려면 Xcode의 빌드 프로세스를 이해하는 것이 중요하다.

이번 글에서는 Xcode 빌드 프로세스의 주요 단계를 정리하고, 각 단계에서 무슨 일이 일어나는지 살펴보자


1️⃣ Xcode 빌드 프로세스 개요

Xcode에서 프로젝트를 빌드할 때는 여러 단계를 거쳐 최종 실행 가능한 앱(Binary)이 생성된다.
이 과정은 다음 5단계로 정리할 수 있다.

단계  설명
Preprocessing (전처리) 소스 코드에서 #import, #define 등의 전처리를 수행
Compiling (컴파일) 소스 코드를 LLVM을 사용해 중간 코드(LLVM IR)로 변환
Assembling (어셈블) 중간 코드(IR)를 기계어로 변환
Linking (링킹) 여러 개의 오브젝트 파일(.o)과 라이브러리를 하나의 실행 파일로 합침
Code Signing & Packaging (코드 서명 및 패키징) 앱 번들을 생성하고 서명하여 실행 가능하도록 준비

이제 각 단계에서 무슨 일이 일어나는지 좀 더 자세히 살펴보자


2️⃣ Xcode 빌드 단계별 과정

✅ 1. Preprocessing (전처리)

C/C++ 기반의 Objective-C 코드에서만 해당되는 과정으로, Swift에서는 별도로 수행되지 않는다.
이 단계에서는 #import, #define 등의 전처리기 지시문이 처리된다.

 

📌 이 단계에서 발생할 수 있는 문제

  • #import로 인한 중복 포함 문제
  • #define이 예상과 다르게 치환되는 문제

💡 Preprocessor 결과를 확인하는 방법

clang -E main.m

위 명령어를 실행하면 전처리된 코드를 확인할 수 있다.


✅ 2. Compiling (컴파일)

Swift 또는 Objective-C 코드를 중간 코드(LLVM IR) 로 변환하는 과정이다.
Xcode는 LLVM(Clang + Swift Compiler) 을 사용해 소스 코드 → LLVM IR → 기계어 순서로 변환한다.

 

📌 이 단계에서 발생할 수 있는 문제

  • Syntax Error: 문법 오류
  • Type Error: 타입 불일치 오류
  • Undefined Symbol: 정의되지 않은 변수나 함수 사용

💡 Swift 컴파일러가 어떻게 코드를 변환하는지 확인하는 방법

swiftc -emit-llvm main.swift

이 명령어를 실행하면 LLVM IR 코드를 확인할 수 있다.


✅ 3. Assembling (어셈블)

컴파일된 중간 코드(LLVM IR)를 실제 CPU가 이해할 수 있는 기계어 코드로 변환하는 과정이다.
이 과정에서는 .o (Object File) 형태의 바이너리 파일이 생성된다.

 

📌 이 단계에서 발생할 수 있는 문제

  • Undefined Reference 오류: 다른 모듈에서 정의된 함수/변수를 찾지 못하는 경우 발생

💡 어셈블된 바이너리 파일 확인하는 방법

swiftc -emit-assembly main.swift

이 명령어를 실행하면 기계어(어셈블리) 코드를 볼 수 있다.


✅ 4. Linking (링킹)

여러 개의 .o (Object File)을 하나의 실행 가능한 바이너리로 합치는 과정이다.
이 과정에서는 라이브러리(.dylib, .a) 및 시스템 프레임워크를 포함한 모든 코드가 하나로 결합된다.

 

📌 이 단계에서 발생할 수 있는 문제

  • Undefined Symbols 오류: 링크할 파일에서 해당 기호(symbol)를 찾을 수 없을 때 발생
  • Duplicate Symbols 오류: 같은 기호가 여러 번 정의되었을 때 발생

💡 링크 과정에서 포함된 파일 확인하는 방법

ld -v

이 명령어를 실행하면 사용된 링커 버전 및 라이브러리 정보를 확인할 수 있다.


✅ 5. Code Signing & Packaging (코드 서명 및 패키징)

마지막으로 앱을 배포할 수 있도록 코드 서명을 수행하고, 최종적으로 .app 번들을 생성한다.
이 과정에서는 Apple의 보안 정책을 준수하는지 검사하고, 앱이 정상적으로 실행될 수 있도록 한다.

 

📌 이 단계에서 발생할 수 있는 문제

  • Code Signing 오류: 인증서가 올바르게 설정되지 않으면 발생
  • Provisioning Profile 오류: 앱 실행에 필요한 프로비저닝 프로필이 없을 경우 발생

💡 Code Signing 로그 확인하는 방법

codesign -vvv --deep MyApp.app

이 명령어를 실행하면 서명이 올바르게 적용되었는지 확인할 수 있다.


3️⃣ Xcode 빌드 속도 최적화 방법

Xcode 빌드가 너무 느려지는 경우, 다음과 같은 방법으로 최적화할 수 있다.

1. 병렬 빌드 활성화

File > Workspace Settings에서 "Parallelize Build" 옵션을 활성화하면 여러 파일을 동시에 빌드할 수 있다.

2. 불필요한 Debug 로그 비활성화

디버그 로그(print(), NSLog())가 많으면 빌드 속도가 느려질 수 있으므로 필요 없는 로그는 제거하는 것이 좋다.

 3. Derived Data 삭제

빌드 캐시가 쌓이면 빌드 속도가 느려질 수 있다. Derived Data를 주기적으로 삭제하면 성능이 개선된다.

rm -rf ~/Library/Developer/Xcode/DerivedData

4. Whole Module Optimization 활성화

Build Settings > Swift Compiler - Code Generation에서 "Whole Module Optimization"을 활성화하면 Swift 컴파일 속도를 크게 향상시킬 수 있다.


정리

✅ Xcode의 빌드 프로세스는 전처리 → 컴파일 → 어셈블 → 링크 → 코드 서명의 5단계로 진행된다.
✅ 컴파일 단계에서는 LLVM을 사용해 소스 코드 → LLVM IR → 기계어 코드로 변환된다.
✅ 링크 단계에서는 여러 개의 오브젝트 파일과 라이브러리가 하나의 실행 파일로 결합된다.
✅ 최종적으로 코드 서명과 패키징을 거쳐 앱이 실행 가능한 상태로 만들어진다.
✅ 빌드 속도를 최적화하려면 병렬 빌드, Derived Data 삭제, Whole Module Optimization 등의 방법을 활용할 수 있다.

 

Xcode 빌드는 단순히 버튼 하나로 끝나는 과정처럼 보이지만, 내부적으로는 꽤 복잡한 단계를 거친다.
이 과정들을 이해하면 빌드 속도를 최적화하고, 발생하는 오류를 빠르게 해결할 수 있다.

이제 직접 빌드 과정을 분석하고, 더 빠르고 안정적인 iOS 앱 개발에 도전해보자

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함