cocos2d-x Win32에서 작업한 Android 프로젝트 Mac OSX용 Android로 포팅?
먼저 간략하게 그동안의 개발과정을 정리해보면, 일단 개발환경이 Windows7 64bit, Visual Studio 2010에 cocos2d-x 2.0.1 win32로 개발하다가 Windows에 cocos2d-x 안드로이드 개발 환경을 만들었었고, iOS는 컴파일 때문에 어쩔수 없이 Mac OSX에 Xcode에서 개발 환경을 설정했었죠. 즉, Android는 Windows에서 빌드, iOS는 Mac OSX에서 빌드한 것이죠.
포스팅들을 보면 아시겠지만, 별 문제 없었습니다. 온갖 에러들을 다 해결해가고 Framework static lib도 Android와 iOS용으로도 만들어가면서 또 온갖 외부 모듈 붙여가면서 잘 했었죠. 근데 요근래 이상한 일이 생겼습니다. 팀원분이 제가만든 프레임워크 모듈을 가져다 쓰는데 있어서 빌드 이슈가 생긴것이죠. 차이점이라면 팀원분은 iOS, Android모두 Mac OSX 환경에서 작업했다는 것...
제가 만든 iOS lib는 가져다 쓰는데 이상이 없었는데, Android lib는 자꾸 h파일을 못 찾겠다고 심술을 부리더군요. 그래서 아예 프레임워크 소스까지 커밋 후, 소스를 공유해서 직접 빌드를 해보라고도 했지만 여전히 빌드가 안되더군요. 아, 이것이 상용 유니티3d엔진과 오픈소스 cocos2d-x의 어쩔 수 없는 빌드 차이인건가? 하면서 저도 Mac OSX에 안드로이드 환경을 만들어 봤습니다.
그런데, 저도 빌드가 안되었습니다. 그래서 정리 들어갑니다. 재미 없을 수도 있으니 귀찮으시면 제일 밑에 결론만 보시면 됩니다.
NDK_ROOT=/Volumes/MacintoshHD2/Android/android-ndk-r8d
COCOS2DX_ROOT=/Volumes/MacintoshHD2/Program/Engine/cocos2d-2.1beta3-x-2.1.0
GAME_ROOT=$COCOS2DX_ROOT/../../Projects/MyTestGame
GAME_ANDROID_ROOT=$GAME_ROOT/proj.android
RESOURCE_ROOT=$GAME_ROOT/Resources
먼저, build_native.sh는 기존 Windows의 cygwin 기준 패스 설정에서 Mac OSX 기준 패스 설정으로 바꿔줬습니다.
Android.mk: Cannot find module with tag 'xxx' in import path
./build_native.sh 를 실행하니 위와같이 에러가 발생합니다. 뭐지? 소스나 폴더구조등등 같은데, 바꾼게 없는데... 구글링 해보니
를 쓰라고 하더군요. 뭐야 이렇게 되면 win32 cygwin에서 빌드할 때랑 mk 파일이 달라지잖아!? 아무튼 해봤습니다.
/Volumes/MacintoshHD2/Android/android-ndk-r8d/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs-debug/game_shared/__/__/Classes/AppDelegate.o: in function AppDelegate::~AppDelegate():jni/../../Classes/AppDelegate.cpp:45: error: undefined reference to 'DataTableManager::purgeDataTableManager()'
이런 에러가 쭉 나더군요. undefined reference to 에러는 예전에 안드로이드 초반에 났던 에러라 내용을 확인해봤지만 그때는 게임 프로젝트에서 mk에 cpp를 추가 안해줘서 그런거고 이미 빌드 잘되던 프레임워크가 에러가 나는 상황이라 다른 문제였습니다. 일단 call import-add-path는 call import-module로 원상복후 했습니다.
혹시나 아무래도 며칠전에 Mac OSX에 cocos2d-x Android 환경 설정하면서 bash_profile 내용을 삭제한 것이 걸려서 다시 내용을 세팅해줬습니다.
export ANDROID_NDK_ROOT=/Volumes/MacintoshHD2/Android/android-ndk-r8d
export NDK_MODULE_PATH=/Volumes/MacintoshHD2/NECO/Program/Engine/cocos2d-2.1beta3-x-2.1.0
export NDK_ROOT=/Volumes/MacintoshHD2/Android/android-ndk-r8d
export PATH=$PATH:$ANDROID_NDK_ROOT
이렇게 해준 후 빌드하니 잘되네요....; 전엔 빼줘야 잘 되던 helloworld도 그냥 잘 됩니다. 음... 어디서 꼬인건지... cocos2d-x 버전업하면서 이런건지 모르겠네요. 아무튼 결론은 뻘짓! 아, 저만 빌드가 잘 되고 있고 팀원분은 아직도 빌드가 안되고 있다는.... 다른 에러로..
지금은 퇴근 후 집이지만 퇴근 바로 막판에 해결되었습니다. 프레임워크 소스버전까지 가져갔는데도 빌드가 안 되었던 것은, 아무래도 제가 요번에 cocos2d-x 2.0.1에서 2.1.0으로 마이그레이션 한 후 그 소스를 가져가시면서 관련 컴파일 에러가 있었던 것이었습니다. 네.. 아직은 저만 2.1.0을 쓰고 있는 상황인거죠. 그런데 소스가져가기 전인 프레임워크 lib를 가져갔을 때 컴파일이 안된건 내일 더 해보던가 여기서 이제 안드로이드 자바쪽 컴파일로 넘어가야겠네요.
포스팅들을 보면 아시겠지만, 별 문제 없었습니다. 온갖 에러들을 다 해결해가고 Framework static lib도 Android와 iOS용으로도 만들어가면서 또 온갖 외부 모듈 붙여가면서 잘 했었죠. 근데 요근래 이상한 일이 생겼습니다. 팀원분이 제가만든 프레임워크 모듈을 가져다 쓰는데 있어서 빌드 이슈가 생긴것이죠. 차이점이라면 팀원분은 iOS, Android모두 Mac OSX 환경에서 작업했다는 것...
제가 만든 iOS lib는 가져다 쓰는데 이상이 없었는데, Android lib는 자꾸 h파일을 못 찾겠다고 심술을 부리더군요. 그래서 아예 프레임워크 소스까지 커밋 후, 소스를 공유해서 직접 빌드를 해보라고도 했지만 여전히 빌드가 안되더군요. 아, 이것이 상용 유니티3d엔진과 오픈소스 cocos2d-x의 어쩔 수 없는 빌드 차이인건가? 하면서 저도 Mac OSX에 안드로이드 환경을 만들어 봤습니다.
그런데, 저도 빌드가 안되었습니다. 그래서 정리 들어갑니다. 재미 없을 수도 있으니 귀찮으시면 제일 밑에 결론만 보시면 됩니다.
NDK_ROOT=/Volumes/MacintoshHD2/Android/android-ndk-r8d
COCOS2DX_ROOT=/Volumes/MacintoshHD2/Program/Engine/cocos2d-2.1beta3-x-2.1.0
GAME_ROOT=$COCOS2DX_ROOT/../../Projects/MyTestGame
GAME_ANDROID_ROOT=$GAME_ROOT/proj.android
RESOURCE_ROOT=$GAME_ROOT/Resources
Android.mk: Cannot find module with tag 'xxx' in import path
./build_native.sh 를 실행하니 위와같이 에러가 발생합니다. 뭐지? 소스나 폴더구조등등 같은데, 바꾼게 없는데... 구글링 해보니
$(call import-module,$(COCOS2DX_ROOT)/../Framework)
대신
$(call import-add-path,$(COCOS2DX_ROOT)/../Framework)
를 쓰라고 하더군요. 뭐야 이렇게 되면 win32 cygwin에서 빌드할 때랑 mk 파일이 달라지잖아!? 아무튼 해봤습니다.
/Volumes/MacintoshHD2/Android/android-ndk-r8d/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs-debug/game_shared/__/__/Classes/AppDelegate.o: in function AppDelegate::~AppDelegate():jni/../../Classes/AppDelegate.cpp:45: error: undefined reference to 'DataTableManager::purgeDataTableManager()'
이런 에러가 쭉 나더군요. undefined reference to 에러는 예전에 안드로이드 초반에 났던 에러라 내용을 확인해봤지만 그때는 게임 프로젝트에서 mk에 cpp를 추가 안해줘서 그런거고 이미 빌드 잘되던 프레임워크가 에러가 나는 상황이라 다른 문제였습니다. 일단 call import-add-path는 call import-module로 원상복후 했습니다.
혹시나 아무래도 며칠전에 Mac OSX에 cocos2d-x Android 환경 설정하면서 bash_profile 내용을 삭제한 것이 걸려서 다시 내용을 세팅해줬습니다.
export ANDROID_NDK_ROOT=/Volumes/MacintoshHD2/Android/android-ndk-r8d
export NDK_MODULE_PATH=/Volumes/MacintoshHD2/NECO/Program/Engine/cocos2d-2.1beta3-x-2.1.0
export NDK_ROOT=/Volumes/MacintoshHD2/Android/android-ndk-r8d
export PATH=$PATH:$ANDROID_NDK_ROOT
이렇게 해준 후 빌드하니 잘되네요....; 전엔 빼줘야 잘 되던 helloworld도 그냥 잘 됩니다. 음... 어디서 꼬인건지... cocos2d-x 버전업하면서 이런건지 모르겠네요. 아무튼 결론은 뻘짓! 아, 저만 빌드가 잘 되고 있고 팀원분은 아직도 빌드가 안되고 있다는.... 다른 에러로..
지금은 퇴근 후 집이지만 퇴근 바로 막판에 해결되었습니다. 프레임워크 소스버전까지 가져갔는데도 빌드가 안 되었던 것은, 아무래도 제가 요번에 cocos2d-x 2.0.1에서 2.1.0으로 마이그레이션 한 후 그 소스를 가져가시면서 관련 컴파일 에러가 있었던 것이었습니다. 네.. 아직은 저만 2.1.0을 쓰고 있는 상황인거죠. 그런데 소스가져가기 전인 프레임워크 lib를 가져갔을 때 컴파일이 안된건 내일 더 해보던가 여기서 이제 안드로이드 자바쪽 컴파일로 넘어가야겠네요.
엄청 간단한 이유였군요! ㅎㅎ
답글삭제저도 몇일전 팀장님쪽에 코드보냈는데 제가 2.0.1 로 작업중여있는데
계속 에러난다고 찾아보니 팀장님은 2.1.0 쓰고계시더군요 =_=
^^ 아무래도 같은 버젼 쓰는게.좋죠.. 저희는 다 각자 다른프로젝트 중이엇는데 마침 제가 업글하는 타이밍랑 같아서 이런일이 ㅋ... 즐 주말되세여~
삭제