2017-04-19 19 views
0

내 앱에서 제 3 자 프레임 워크를 사용해야합니다. 내 프로젝트의 프레임 워크를 포함하지만 나는 다음과 같은 링커 오류를 얻을 :iOS 프레임 워크에서 중복 된 심볼

duplicate symbol _SRHTTPResponseErrorKey in: 
    Shared/Libraries/XXX.framework/XXXSDK(SRWebSocket.o) 
    Shared/Libraries/YYY.framework/YYYSDK(YYYSRWebSocket.o) 

프레임 워크 (들)을 변경하지 않고 이러한 오류를 해결하는 방법이 있나요?

답변

2

문제는 프레임 워크와 코드 (또는 다른 프레임 워크)가 동일한 클래스/프레임 워크를 포함한다는 것입니다. 프레임 워크의 개발자는 자신의 프레임 워크를 다른 프레임 워크의 우산으로 만드는 것이 좋은 생각이라고 생각했습니다. 그렇지 않습니다. 프레임 워크에는 다른 프레임 워크가 포함되어서는 안됩니다.

BTW : 이유는 ObjectiveC 프레임 워크의 모든 클래스에 접두사가 있어야하는 이유입니다. 그것은 갈등의 가능성을 낮춘다.

당신을 위해 다음과 같은 솔루션이 있습니다 : 코드에서 클래스 이름을 바꿉니다

  1. 당신이 두 개의 충돌하는 클래스 중 하나에 추가 할 경우

    . 어쩌면 프레임 워크를 포크하고 모든 클래스의 접두어를 변경하거나 3)의 기술로 래퍼 프레임 워크를 생성하십시오.

  2. 개발자에게 모든 외부 코드를 제거하고 링크 만하도록 요청하십시오. 또한 사용자는 종속성을 문서화해야하므로 프레임 워크의 사용자는 추가 할 버전을 알 수 있습니다. 종속 프레임 워크를 가져 오는 것보다 CocoaPods/Carthage 또는 makefile과 같은 의존성 프레임 워크를 사용할 수 있습니다.

  3. 2) 프레임 워크가 다른 고객에 의해 사용되며 개발자가 코드를 깨뜨리지 않아서 가능하지 않은 경우 (바보 같은 이유로) : 프레임 워크 개발자에게 각 클래스에 대해 그들은 아마 클래스의 이름을 변경 here

+0

설명처럼 자신의 코드에 "다른 C 플래그"아니다 ('SRWebSocket'과 문제의'YYYSRWebSocket' 참조). 그들은 아마도 어떤 상수를 놓쳤을 것입니다. 그러나 하나의 기호를 놓치면 문제가 발생하기에 충분합니다 ... 이미 프레임 워크에 포함되어 있기 때문에 클래스에서 심볼을 제거하는 것으로 충분할 수 있습니다. – Sulthan

+0

네, 그렇습니다. :) – ObjectAlchemist

+0

그런데 프레임 워크를 다른 프레임 워크에 포함시키는 이유는 구현을 숨기기 위해서입니다. 예를 들어 cocoapod에 컴파일 된 코드와 프레임 워크가있는 정적 라이브러리가있는 경우입니다. 나는 Google Analytics가 그렇게하고 있다고 생각합니다. – Sulthan