본문 바로가기
  • SDXL 1.0 + 한복 LoRA
  • SDXL 1.0 + 한복 LoRA
Development/iPhone

[옛 글] [iOS] 프로젝트에 프로젝트 삽입 - 2 : 프레임워크 추가하기

by 마즈다 2013. 7. 19.
반응형

최초 작성일 : 2011/08/31 13:48 


이번에는 프로젝트에 프로젝트 삽입하기에 이어 프레임워크와 라이브러리를

추가하는 부분에 대한 팁이다.

물론 추가하는 것 자체를 모르는 사람은 아마도 거의 없을 것이다.
일단 간단하게는 파인더의 경로상에서 프레임워크나 라이브러리를 찾아
부드럽게 해당 프레임워크나 라이브러리를 드래그앤 드롭하여
Xcode의 프로젝트 탐색창에 떨어뜨려주면 된다.
(참고로 프레임워크는 .framework확장자로 끝나는 디렉토리 형태이고
 .a 확장자를 갖 것은 정적 라이브러리, .dylib 확장자를 갖는 것은 동적 라이브러리이다)

그럼 이게 뭐가 어려워서 팁을 쓰고 난리 부르스냐...?

iOS의 프로그래밍 언어인 Objective-c는 조상격인  C/C++과도 호환이 가능한
언어이다. 이 것은 언어의 확장성 면에서 보면 상당히 좋은 특징이긴 하지만
자바와는 달리 라이브러리를 구했을 때 언어적 기반이 다르면 손을 좀 봐줘야 하는
문제가 있다.

이번에 겪은 가장 큰 문제는

1. 프레임워크를 삽입해서 컴파일했더니   x86_64, i386, armv7, armv6 등의
    아키텍쳐에 대한 심볼이 없다는 에러가 난다.
2. 헤더파일의 경로 설정의 문제
이 정도가 있다.
차근차근 살펴보자면
1. 특정 아키텍쳐에 대한 심볼이 없다는 에러가 발생하는 경우. 
사실 이 경우가 가장 혼란스럽고 해결하는데 시간이 많이 걸렸다.
프로젝트의 빌드 세팅에서 Architectures, BaseSDK, Valid Architectures를
아무리 설정을 해줘도 계속 에러를 뿜어내니 환장할 지경이었다.
※ 쉽게 말해 Architecture는 하드웨어인 CPU를 설정하는 것이고
   BaseSDK는 해당 CPU에 맞는 SDK를 설정하는 것이고
   Valid Architectures는 호환 가능한 CPU를 설정하는 것이다.
   BaseSDK를 먼저 선택하면 Architecture는 자동으로 설정되는데
   i386(32비트 CPU)와 x86_64(64비트)의 인텔계열 CPU는 Mac OS X를
   선택했을 때 설정되고 iOS를 선택하면 armv6, armv7이 선택된다.



특히 문제가 많이 발생하는 경우는 C++로 작성된 라이브러리나 프레임워크를
추가하는 경우인데. 계속해서 i386또는 x86_64 Architecture용 심볼이 없다는
에러가 발생했다.
이 때 가장 쉽게 해결하는 방법은 프로젝트 경로상에 내용 없이 비어있는 .cpp 파일을
하나 추가해서 컴파일 해주면 간단히 해결된다.
이유는...사실 잘 모르겠다. 이메일 관련 라이브러리를 검색하다가 찾게된
ChilKat라는 상용 라이브러리 제작사 홈페이지에서 이같은 내용을 발견했다...^^;;;
2. 헤더파일의 경로 문제는 사실 고수들에게는 문제라고 할 것 까지도 없다.
하지만 나는 영원한 초보니까...ㅠ.ㅠ
우선 모두 알고 있듯이 사용자가 만든 헤더파일은 프로젝트 내에 포함되어 있으므로
별다른 표시 없이 그냥
#import "header.h"
이렇게 사용을 하게 된다.
다음 프레임워크에 포함된 헤더파일은 프레임워크라는 별도의 디렉토리에
위치하므로(앞서 프레임워크는 .framwork확장자로 끝나는 이름의 디렉토리라고
말했다)
#import <Framework/Framework.h>
이렇게 프레임워크 이름의 경로명을 앞에 붙여주게 되며 ""이 아닌 <>로 감싸주게
된다.
문제는 라이브러리를 사용할 경우나 아니면 프로젝트 내에 프로젝트가 삽입되어
있는데 이 삽입된 프로젝트 내의 파일들이 모두 <>로 표현된 import문을 쓰고
있을 경우이다.
우선 라이브러리의 경우 하나의 단일 파일로 배포를 하게 되는데 이 안에는
실행 파일이 될 .c, .cpp, .m, .mm 등의 파일만이 포함되며 헤더 파일은 별도로
배포하게 된다. 따라서 .a, .dylib의 라이브러리 파일을 구할 경우에는 반드시
헤더파일(주로 include라는 디렉토리에 배포한다)을 같이 다운로드받아 프로젝트에
포함시켜야 한다.
다음 프로젝트 여러개가 중첩된 경우...
이 경우는 거꾸로 거슬로 올라가야 하는데...
만일 import문에 <>를 사용해서 헤더파일을 찾을 수 없다는 에러가 발생한다면
상위 프로젝트가 하위프로젝트의 어떤 타겟에 의존(사용)하고 있는지를 확인하여
혹시 정적 라이브러리가 참조되고 있다면 이 것을 프레임워크로 바꾸어주어야 한다.
하위 프로젝트의 타겟에 프레임워크가 없다면 새로 빌드를 해주어야 한다.
말로하니 엄청 복잡해보인다...ㅠ. ㅠ
어쨌든 대체로 이정도 하면 헤더 파일 문제도 해결된다.
어제도 오늘도... 그리고 내일도...
늘 시시한 팁만 정리하고 있는 나는 언제 고수의 반열에 오를까...-.-

반응형