2014-06-17 4 views
0

내 정적 라이브러리에 링크 된 앱이 있습니다.자체가 동적 라이브러리와 링크되는 정적 라이브러리와 링크하는 방법은 무엇입니까?

방금 ​​Apple의 Reachability Code를 라이브러리에 추가했는데 이로 인해 앱 연결이 끊어졌습니다 (앱이 도달 가능성 코드를 사용하지 않거나 간접적으로 포함하더라도 Reachability.m이 포함됨). 라이브러리의 컴파일 소스 섹션).

그래서 응용 프로그램의 다른 링커 플래그에 -ObjC를 추가하여 도달 가능성에 대한 연결 오류를 해결했습니다. 그러나 라이브러리는 또한 ZipArchive를 사용 중이며 -ObjC 링커 플래그를 추가하면 링크 오류가 발생합니다.

그럼 어떻게해야합니까? -ObjC를 해제하고 Reachability는 링크하지 않으며 포함 시키며 ZipArchive는 링크하지 않습니다. 해결책이 있습니까?

샘플 ZipArchiev 링커 오류 :

Undefined symbols for architecture arm64: 
    "_deflate", referenced from: 
     _zipWriteInFileInZip in libMyLibrary.a(zip.o) 
     _zipCloseFileInZipRaw in libMyLibrary.a(zip.o) 

샘플 도달 가능성 링커 오류 :

정적 라이브러리는 -ObjC 플래그로 구축하며 libz.1.2.5.dylib와 링크되고
Undefined symbols for architecture arm64: 
    "_SCNetworkReachabilityGetFlags", referenced from: 
     -[Reachability connectionRequired] in libMyLibrary.a(Reachability.o) 
     -[Reachability currentReachabilityStatus] in libMyLibrary.a(Reachability.o) 

실제로 처음에 게시 한 후에 찾은 해결책이 있습니다. 응용 프로그램에 -ObjC 플래그를 추가하고 libz.1.2.5.dylib와 함께 응용 프로그램을 추가 할 수 있습니다. 하지만 좋은 디커플링이 아닌 IMO - 제 정적 라이브러리는 다른 사람들의 앱에 의해 배포되고 사용 될 것입니다. libz를 사용한다는 사실은 그들에게 투명해야하며, 제 라이브러리에 이미 연결되어 있다면 그것과 연결해서는 안됩니다 . 정적 라이브러리와 libz 동적 라이브러리를 연결해야하는 응용 프로그램없이 링크 문제를 해결할 수있는 방법이 있습니까?

+0

를 연결해야합니까? –

+0

도달 가능성은 라이브러리가 아니며 소스 코드 (Apple에서 제공) – Gruntcakes

+0

예 그렇지만 구현 파일이 앱 소스에 연결되어 있는지 확인해야합니다. –

답변

0

Reachability를 위해 -ObjC가 필요한 이유가 확실하지 않습니다. 이것은 정적 라이브러리의 범주를 사용할 때 보통 필요합니다. 하지만 Reachability에는 카테고리가 표시되지 않습니다.

어쨌든 여기에 -ObjC없이 작업 할 수있는 카테고리를 찾을 수있는 해결책이 있습니다. 바라기를 이것은 당신을 위해 역시 작동 할지도 모르다.

-ObjC 링커 플래그를 제거하십시오. 많은 것들로 인해 문제가 발생할 수 있기 때문에 거기에서 시작하는 것이 가장 좋습니다.

이제 정적 라이브러리 코드에서 Reachability 클래스를 강제로 바이너리로 컴파일하고 런타임에로드해야합니다. (내 평신도의 설명, 아마도 실제 기술이 아닌). 이렇게하려면이 함수를 Reachability 클래스의 맨 위에 추가하면됩니다.

void loadReachability() 
{ 
    // This is a trick to force the compiler to include this code. 
} 

@implementation 외부에이 함수를 추가합니다. 나는 공개적으로하기 위해 그것을 .h에 넣어야한다.

정적 라이브러리에서 실제로 호출하지 않습니다. 컴파일러는 내가 그것을 호출 할 것이라고 생각할 필요가있다. return 문 다음에 호출하므로 런타임에는 발생하지 않습니다. 컴파일러를 속일뿐입니다. 실제로 코드 내에서 Reachability를 사용하지는 않지만,로드해야하는 10 가지 범주보다는 "Reachability"를 사용하도록 아래 코드를 변경했습니다.

+ (LPFSessionManager *)sharedManager 
{ 
    static LPFSessionManager *sharedManager = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedManager = [[LPFSessionManager alloc] init]; 
    }); 
    return sharedManager; 

    // Notice we don't really need to call this. We're faking out the compiler to include some code. 
    loadReachability(); 
} 

대신이 방법을 사용할 수 있습니다.

내가 여기에이 솔루션을 발견하고 나를 위해 큰 노력하고 있어요 : 당신이 도달 가능성이 엑스 코드의 바이너리와 Objective-C categories in static library

관련 문제