본문 바로가기
프로그래밍/iOS

아이폰 용 정적 라이브러리 만들기

by 백룡화검 2012. 6. 21.

출처 : http://lambert.tistory.com/344


이전 포스트 아이폰 정적 라이브러리 템플릿과 기존 프로젝트에 정적 라이브러리 추가하기에 서는 템플릿을 이용해 아이폰 용 정적 라이브러리(Static Library)를 만들고 적용하는 방법을 알아 보았다. 그런데 템플릿을 이용하는 방법을 설명하였기 때문에  정적 라이브러리를 만드는 방법에 대한 설명이 부족했다. 이에 그 부분에 대한 보충 설명을 하고자 한다.


[샘플 프로젝트]


1. 정적 라이브러리 프로젝트 생성
정적 라이브러리 생성을 위해 프로젝트를 생성한다.  프로젝트 템플릿 선택 창에서 Library >  Cocoa Touch Static Library를 선택한 후 이름을"LPLibrary"라고 하였다.
* 설명에 사용된 Xcode 버전은 3.2.3 이다.


프로젝트를 생성하면 다음 그림과 같이 좌측 Groups & Files 창에서 "libLPLibrary.a" Products와  "LPLibrary" Targets이 생성된 것을 확인할 수 있다.



2. 라이브러리 클래스 생성
예를 위해 간단한 라이브러리 클래스를 하나 생성하자. UIView를 상속하는 LPView라는 클래스를 생성했다.


그리고 LPView.m 클래스의 initWithFrame: 메소드에  다음과 같이 로그를 출력하는 코딩을 추가한다.

- (id)initWithFrame:(CGRect)frame {

    if ((self = [super initWithFrame:frame])) {

        // Initialization code

NSLog(@"정적 라이브러리 테스트");

    }

    return self;

}


이제 Xcode에서 좌측 Groups & Files 창에서 Targets의 LPLibray를 선택하고, 우측 상단의 파일 목록에서 LPView.h를 선택하여 Role 항목의 값을 Public로 변경한다.


마지막으로 LPLibrary 프로젝트를 빌드(Command + B) 한 후, 터미널에서 다음과 같이 두 개의 명령어를 각각 실행해 보자. 만약 tree 명령어가 존재하지 않는다면 다음 링크를 참고하라.

tree 명령어를 실행하여, 다음 그림과 같은 구조로 빌드가 되었음을 확인할 수 있다.


그리고 nm libLPLibrary.a 명령어를 싱행하여 생성된 심벌을 확인할 수 있다.  예에서는 LPView 클래스가 .objc_class_name_LPView라는 이름으로 선언되어 있다.



3. 정적 라이브러리를 사용할 프로젝트 생성 
간단한 예를 들기위해 Window-based Application 템플릿을 선택한 후 StaticTest라는 이름으로 프로젝트를 생성하였다.



4. 정적 라이브러리 프로젝트 참조
이미 생성한 정적 라이브러리를 사용하기 위해, Xcode 또는 파인더에서,  LPLibrary 프로젝트를 StaticTest 프로젝트로 드래그 한다. 그 후 결과는 다음 그림과 같을 것이다.


이 때 다음 그림과 같이 "Copy items into destination group’s folder"를 체그하지 말자. 이는 복사하지 않고 참조만 하는 방식으로 정적 라이브러리의 변경사항을 자동으로 반영하기 위해서이다.



5. Link binary와 Direct dependency
다음은 참조한 LPLibrary의 libLPLibrary.a를 드래그하여 StaticTest 프로젝트의 Targets인 StaticTest의 Link Binary With Libraries로 드래그 한다. 다음에 설명하는 Direct dependency를 추가하는 방식도 가능하다.


이제 StaticTest 타겟을 더블 클릭하여 Target "StaticTest" Info 창에서 General 탭을 선택한 후, 화면 위의 Direct Dependencies에 LPLibrary를 추가한다. 바로 위에서 언급했듯이 Linked Libraries도 이 방식으로 추가할 수 있다.



 
6. 퍼블릭 헤더를 위한 설정
이 상태에서 StaticTest 프로젝트의 StaticTestAppDelegate.m 클래스에 다음과 같이 LPView.h를 임포트한 후 빌드앤 런 하자. 그러면 아마도 다음과 같이 에러를 볼 수 있는 것이다. 에러의 내용처럼 LPView.h를 찾지 못하고 있음을 확인할 수 있다.


이 문제를 해결하기 위해서 Target "StaticTest" Info의 Build 탭의 "Header Search Paths"에 다음의 값을 설정해야 한다.

${PROJECT_DIR}/../LPLibrary/build/${BUILD_STYLE}-${PLATFORM_NAME}/usr/local/include

다시 빌드앤런 하면 에러 없이 실행될 것이다. 만약 계속 에러가 발생한다면 eader Search Paths를 다시 확인해 보면 될 것이다. 위 값의 변수의 의미는 다음과 같다.

 PROJECT_DIR  현재 프로젝트(StaticTest)의 루트 디렉토리
 LPLibrary  정적 라이브러리 프로젝트 명
 BUILD_STYLE  Debug 또는 Release
 PLATFORM_NAME  iphonesimulator 또는 iphoneos


7. 마지막 테스트
자 이제 마지막으로 간단한 테스트 후 정적 라이브러리 만들기 과정을 마무리 하겠다. 본 설명에서 부족한 점은 하단의 URL을 참고하라. 미리 언급한다면, 라이브러리 추가와 사용예 관한 내용들이다. 본 포스트의 예를 따라해 본 후 꼭, 라이브러리 추가와 반영에 관한 부분을 테스트 해보길 권정한다. 그러면 아직도 세세하게 더 공부해야할 부분이 많다는 것을 알게 될 것이다. 기회가 되는 대로 Static Library에 대해 계속 포스트할 예정이다. 

StaticTestAppDelegate.m 클래스의 application:didFinishLaunchingWithOptions: 메소드를 다음과 같이 수정하고 다시 빌드앤헌 해보자. 에러 없이 위에서 작성한 로그가 찍힌다면 본 과정을 마무리해도 될 것이다. 이제 남은 일은 재사용한 코드의 작성과 정리 뿐일 것이다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.

LPView *view = [[LPView alloc] init];

    [window makeKeyAndVisible];

return YES;

}




[참고]