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 삼스

댓글을 달아 주세요

  1. bbanggura

    안녕하세요. lib duplicate 문제를 해결하려 구글링 중 삼스님의 글을 보고 희망을 갖고 시도하던 중
    문제가 생겨 글남깁니다.

    사용중인 lib의 지원하는 아키텍쳐는 i386, armv7, armv7s, x86_64, arm64 이고
    작성해주신 방법으로 시도하여 잘 진행하던중 arm64에서 막혔습니다.
    "Inappropriate file type or format"와 같은 에러를 뱉으면서요

    혹 64비트는 오브젝트 추출이 불가능한지.. 아니면 해결방법을 여쭙고 싶습니다.
    답변 부탁드릴게요.

    2015.09.11 11:17 [ ADDR : EDIT/ DEL : REPLY ]
    • samse

      어떤 명령실행중에 그렇게 나오던가요?

      2015.09.14 10:37 [ ADDR : EDIT/ DEL ]