2017-03-02 4 views
1

프레임 워크 내에서 사용하는 정적 프레임 워크 B가 있습니다. B에는 클래스 CI가 있습니다. 즉, 아래 그림의 A에 노출하고 싶습니다. 앱에서 사용할 수 있기를 원합니다. 수업.정적 프레임 워크에 사용 된 노출 헤더 공개 프레임

앱> 프레임 워크 A> I는의 공개 헤더 C의 헤더를 포함하려고하면 정적 프레임 워크 B> C 클래스

, 내가 얻을 '중복 인터페이스 정의'. 하지만 코드가 B에서 A로 컴파일되므로 클래스 인터페이스를 노출해야합니다. 아마도 앱이 올바르게 연결될 수 있습니다 ...?

+0

헤더를 만들어 B와 C를 가져온 다음 A? – antonio081014

+0

헤더를 잘 가져올 수 있습니다. 문제를 일으키는 A에서 공개로 만듭니다. – Nick

답변

0

해결 방법을 통해이 작업을 수행했습니다.

정적 라이브러리/프레임 워크를 다른 프레임 워크/정적 라이브러리로 컴파일 할 때 해당 심볼은 계속 노출됩니다 (nm <binary> | grep <symbol> 확인). 즉, 프레임 워크 A의 클래스 C에 대한 헤더를 포함하여 해당 심볼을 알기 위해 앱 코드가 필요하다는 것을 의미합니다.

프레임 워크 A의 헤더에 클래스 C 헤더를 포함해야합니다. 프레임 워크를 컴파일 할 때 "ClassC.h"을 사용해야하지만, 프레임 워크를 사용할 때는 <FrameworkName/ClassC.h>이 필요합니다. 즉, 응용 프로그램에 포함 된 프레임 워크의 위치입니다. 이렇게하려면 실행 스크립트 단계에서 제거 된 매크로를 사용하십시오.

:

그래서, 당신의 프레임 워크에서 타겟 빌드 단계는, 클래스 C에 대한 헤더 후 '스크립트 실행'단계를 추가하고 다음을 붙여 사본 헤더 단계의 '공공'섹션에 있는지 확인

TARGET_MACRO="TARGET_FRAMEWORK" 
cd -P "$BUILT_PRODUCTS_DIR/$WRAPPER_NAME/Headers/" 
perl -0pi -e "s/\#if ${TARGET_MACRO}.*?\#else\r?\n?(.*?)\r?\n?\#endif/\1/sg" *.h 

변경`TARGET_FRAMEWORK는 "무엇이든, 또는 그것을두고 있습니다. 프레임 워크 A의

는, 전 처리기 매크로에서 설정을 구축 모든 구성을 구축하기위한 TARGET_FRAMEWORK=1을 추가합니다.

그런 포함하여 프레임 워크 A를 헤더에 수업 C : 사용 :

#if TARGET_FRAMEWORK 
#import "ClassC.h" 
#else 
#import <FrameworkA/ClassC.h> 
#endif