cocos2d-x 기존 c++로 만든 lib를 xcode ios용 static lib로 만들어서 게임프로젝트에 사용하기

cocos2d-x Android Framework lib는 완성을 했었고 cocos2d-x ios에서는 Framework를 lib까지 만들지는 않고 프로젝트에 직접 파일을 추가해서 빌드를 해봤었죠. 이제는 지난 포스팅에서 언급했듯이 Framework를 lib로 만들어서 개발할 수 있는 환경을 만들어보겠습니다.

이전 포스팅 내용과 연관되어있는 부분도 있고 제 개인 환경부분(폴더구조등)에 대한 설명이라 약간 노말하지 않을 수 있습니다. 이점 염두해 두시고 봐주세요.

 Xcode에서 new project -> iOS -> Framework & Library -> Cocoa Touch Static Library를 선택합니다.

 Product Name은 원하시는 것을 써주시고 저는 win32와 android static lib가 모두 Framework 였기에 이렇게 기입했습니다.

 svn으로 관리되고 있는 저희 프로젝트 폴더 구조인데요 역시나 win32나 android가 그랬듯 Engine의 하위에 생성되도록 해줍니다. 여기서 FrameworkSrc는 win32버젼과 Android.mk가 들어있는 폴더인데 Framework는 svn관리를 안하고 있어서 따로 복사해서 쓰려고 저렇게 준비를 해봤습니다.

 이렇게 하는 이유는 일단 같이 개발중인 팀원들에게 lib를 만들어 인터페이스만 공개할 것이기 때문입니다. 이게 아니라면 그냥 svn에 올렸을 테고 Framework 소스 복사 하는 과정은 없겠죠?

 기본 Framework static lib가 만들어졌습니다. 이제 win32에서 작업했던 cpp, h를 추가해줘야합니다.

 win32의 vcxproj나 user, stdafx.cpp, h등은 복사하지 않고 순수 구현된 소스 들만 폴더째로 복사했습니다.

 Add File to나 command + option + a 를 눌러 폴더째로 파일들을 추가합니다.

Framework 프로젝트에 파일들이 추가되었습니다. 이제 빌드를 해보면,

'cocoa/CCObject.h' file not found 등으로 당연히 에러를 뿜어냅니다. 참조 폴더등의 설정을 해줘야합니다.

"$(SRCROOT)"
"$(SRCROOT)/../../Engine/cocos2d-2.0-rc2-x-2.0.1/cocos2dx"
"$(SRCROOT)/../../Engine/cocos2d-2.0-rc2-x-2.0.1/cocos2dx/include"
"$(SRCROOT)/../../Engine/cocos2d-2.0-rc2-x-2.0.1/cocos2dx/platform/ios"
"$(SRCROOT)/../../Engine/cocos2d-2.0-rc2-x-2.0.1/cocos2dx/platform/third_party/ios"
"$(SRCROOT)/../../Engine/cocos2d-2.0-rc2-x-2.0.1/cocos2dx/kazmath/include"
"$(SRCROOT)/../../Engine/cocos2d-2.0-rc2-x-2.0.1/CocosDenshion/include"

Header Search Paths에 위와 같이 추가를 해줬습니다. 물론 여기서는 각 개발 진행중인 프로젝트 디렉토리 구조에 맞게 달라지겠죠.

자 다시 빌드를 해보면,
#error  "Can not recognize the target platform, compling under a unsupported platform?"
뿜어내는군요. cocos2d-x 프로젝트 template로 만든게 아닌 순수 cocoa 프로젝트다 보니 이거저거 다 걸리네요.

  • COCOS2D_DEBUG=1
  • TARGET_OS_IPHONE

Preprocessor Macros의 Debug쪽에 위 2개를 추가합니다.

 드디어 빌드 성공했습니다.

사용자 -> username -> 라이브러리 -> Developer -> Xcode -> DerivedData -> 프로젝트명 -> Build -> Products -> Debug-폰시뮬레이터 에 가보면 libFramework.a라는 static lib가 생성되어져있습니다. 쉽게 이동하시려면 프로젝트 네비게이터에서 Products에 있는 libFramework.a를 마우스 우클릭 -> Show in Finder하시거나 finder에서 command + shift + G를 눌러 ~/Library/Developer/Xcode/DerivedData 등으로 이동하시면 됩니다.

일단 iphonesimulator용 static lib가 만들어진 것으로 나중에 디바이스를 연결해서 디바이스용으로도 빌드를 해서 사용해야 합니다. 이부분은 나중에 따로 정리를 해봐야겠네요. 그리고 Release 부분도 신경을 써주셔야 하겠지요. COCOS2D_DEBUG=1는 넣지 않는다던지 이런 것들이요.

이제는 만들어진 static lib를 게임 프로젝트에서 사용해 보도록 해볼게요.

이제 lib를 만들었으니 기존에 게임 프로젝트에 소스 통으로 넣었던 Framework lib 파일들을 다 빼줍니다. 제 경우에는 위와 같이 4가지 Feature가 됩니다.

과감히 Move to Trash를 눌러서 원본 파일까지 삭제해 버립니다. 파인더에 폴더구조는 남아있으니 폴더는 지워주시기 바랍니다.

"$(SRCROOT)/../Libs/Framework/include"
Header Search Paths에 svn으로 관리되는 중인 Framework의 h파일만 모여있는 곳을 추가해 줍니다.

 이제 Lib를 추가해줘야 하는데 하기전에 위에서 생성되었던 폴더에 있는 libFramework.a를 자신이 원하는 폴더에 복사를 해줍니다. 저는 위 스샷과 같이 복사를 해줬구요.

Build Phases -> Link Binary With Libraries에서 + 버튼을 눌르시고

Add Other을 눌러서 복사했던 libFramework.a를 추가해줍니다.

아니면 finder에서 libFramework.a를 프로젝트 네비게이터에 바로 드래그&드롭 하셔도 됩니다. 이렇게 하실때는 Copy items into destination group's folder (if needed) 체크 해제하시고 하시기바랍니다. 체크를 하면 libFramework.a가 xcodeproj가 위치한 디렉토리에 복사본이 만들어집니다. 그냥 원본 위치에 있는걸 쓰면 되겠죠?


자 추가되었습니다.

빌드 성공되었고 게임도 잘 실행이 되네요. 이제 만들어진 libFramework.a static lib만 svn에 커밋하면 되겠습니다.

댓글

이 블로그의 인기 게시물

'xxx.exe' 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다.

다른 프로세스가 파일을 사용 중이기 때문에 프로세스가 액세스 할 수 없습니다

[GWork] LNK2038 'RuntimeLibrary'에 대해 불일치가 검색되었습니다. 'MDd_DynamicDebug' 값이 'MTd_StaticDebug' 값과 일치하지 않습니다.