2015년 3월 3일 화요일

Xcode Undefined symbols 오류 발생원인

Xcode Undefined symbols 오류 발생원인


Xcode에서 빌드할 때 아래와 같은 오류가 발생할 때 가 있다.
Undefined symbols for architecture armv7 
이 오류는 대개 3가지 원인 때문에 발생하는데 각각의 상황별로 해결책을 아래에 정리 해 보았다.

  1. 헤더를 import 했지만, 알맞은 라이브러리를 링크하지 않았을 때가 가장 일반적인 원인이고 특히, 프로젝트에 기본적으로 포함되지 않은 라이브러리들의 헤더가 추가 되어 있는 경우가 대부분이다.
    • [Build Phases] - [Link Binary With Libraries]에 알맞은 라이브러리를 추가해준다.
    • 기본 라이브러리 search path 밖에 있는 라이브러리를 추가하고 싶을 때는 [Build Settings] - [Library Search Paths]에 해당 라이브러리가 있는 폴더를 추가하고 [Build Settings] - [Other Linker Flags]에  -l{라이브러리_이름(lib prefix는 제외하고)}을 추가해준다.
  2. 프로젝트로 파일들은 복사한 후에, 컴파일 소스에 추가하지 않은 경우
    • [Build Phases] - [Compile Sources]에 새로운 .m 파일들을 추가해준다.
  3. 시뮬레이터용 i386 같은 다른 아키텍쳐를 타겟으로 빌드된 정적 라이브러리를 추가한 경우
    1. 라이브러리 벤더에서 CPU 아키텍쳐 별로 라이브러리를 제공한다면 시뮬레이터용(i386)과 디바이스용(armv7) 모두 추가해준다.

Xcode에서 빌드할 때 "Undefined symbols" 오류가 발생하는 경우, 대체로 다음과 같은 세 가지 원인 중 하나 때문입니다:

  1. 필요한 라이브러리가 빠졌을 때 이 경우에는 코드에서 사용된 헤더 파일은 import 되었지만, 알맞은 라이브러리를 링크하지 않은 것입니다. 이 경우, 빌드 설정의 "Build Phases" - "Link Binary With Libraries"에서 알맞은 라이브러리를 추가해야 합니다. 검색 경로에 없는 라이브러리를 추가하려면, "Build Settings" - "Library Search Paths"에서 해당 라이브러리가 위치한 폴더를 추가하고, "Build Settings" - "Other Linker Flags"에 -l{라이브러리 이름(단, lib 접두사는 제외)}을 추가해야 합니다.
  2. 소스 파일이 컴파일되지 않았을 때 이 경우에는 프로젝트로 파일을 복사한 후, 컴파일 소스에 추가하지 않은 것입니다. 이 경우, 빌드 설정의 "Build Phases" - "Compile Sources"에서 새로운 .m 파일을 추가해야 합니다.
  3. 다른 아키텍처용 라이브러리를 추가했을 때 이 경우에는 시뮬레이터용(i386 등)과 디바이스용(armv7 등) 모두를 추가해야 하는데, 라이브러리 벤더에서 CPU 아키텍처 별로 라이브러리를 제공하지 않은 경우, 오류가 발생할 수 있습니다.