iOS2013. 8. 28. 23:01


3rd party library를 사용하다보면 서로 같은 심볼을 사용하게 되어서 아래와 같은 링크에러가 나는 경우가 종종 있다.

ld: duplicate symbol .objc_class_name_CJSONScanner in /Users/myappOne/TapjoyConnect/Frameworks/libTapjoyConnectSimulatorRewardInstall_Ads_Pinch.a(CJSONScanner.o) and /Developer/Projects/BuildOutput/Debug-iphonesimulator/OtherLibrary_d.a(CJSONScanner.o)
이 경우 해결 방법을 정리하겠다.

2개의 3rd party library가 있고 소스가 없는 상황을 가정한다.
libtool, lipo, ar명령으로 라이브러리를 extract하고 recombine한다.

먼저 라이브러리가 어떤 아키텍쳐를 지원하는지 확인한다.

$ lipo -info libTapjoy.a
Architectures in the fat file: libTapjoy.a are: armv6 i386

armv6와 i386를 지원하는것을 알 수 있다. 여기서 armv6를 extract한다.

$ lipo -extract_family armv6 -output libTapjoy-armv6.a libTapjoy.a
$ mkdir armv6
$ cd armv6
$ ar -x ../libTapjoy-armv6.a

같은 방법으로 다른 라이브러리의 동일아키텍쳐를 extract하는데 같은 디렉토리에 한다. 그리고 다음과 같이 다시 recombine한다.

$ libtool -static -o ../lib-armv6.a *.o

아키텍쳐별로 이 과정을 마친 후 다시 lipo로 합친다.

$ cd ..
$ lipo -create -output lib.a lib-armv6.a lib-i386.a




Posted by 삼스