如何链接自身与动态库链接的静态库?

时间:2014-06-17 20:03:14

标签: ios xcode

我有一个链接到我的静态库的应用程序。

我刚刚将Apple的可访问性代码添加到库中,但这导致应用程序停止链接(即使应用程序不使用可访问性代码,也不是间接包含它,另外还有可达性.m包含在库的“编译源”部分中。)

所以我在应用程序中添加了-ObjC到Other Linker Flags,这解决了Reachability的链接错误。但是该库也使用ZipArchive并添加-ObjC链接器标志导致与此相关的链接错误。

那我该怎么办?保留-ObjC off和Reachability没有链接,包括它和ZipArchive没有链接。有解决方案吗?

示例ZipArchiev链接器错误:

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

Sample Reachability链接器错误:

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链接

我确实有一个解决方案,我在最初发布之后找到了 - 我可以将-ObjC标志添加到应用程序,并另外将应用程序与libz.1.2.5.dylib链接。但IMO并不是很好的解耦 - 我的静态库将由其他人的应用程序分发和使用,并且它使用libz的事实应该对他们透明,如果他们已经已经不应该对它进行链接链接我的图书馆。 有没有办法解决链接问题,而不必将应用程序链接到我的静态库和libz动态库?

1 个答案:

答案 0 :(得分:0)

我不确定为什么你需要-ObjC来实现可达性。当您使用静态库中的类别时,通常需要这样做。但是我没有在可达性中看到任何类别。

无论如何,这是我找到的一种解决方案,可以在没有-ObjC的情况下让类别工作。希望这对你也有用。

删除-ObjC链接器标志。因为它会导致许多东西出现问题,所以最好从那里开始。

现在,从您的静态库代码中,您希望强制Reachability类被编译到二进制文件中并在运行时加载(这是我的外行人的描述,可能不是真正的技术问题)。为此,只需将此函数添加到Reachability类的顶部:

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

我在@implementation之外添加了这个。我必须把它放在.h中才能公开。

我实际上从静态库中调用它。编译器只需要认为我会调用它。我在return语句之后调用它,所以它不会在运行时发生。刚刚伪造出编译器。我在我的代码中实际上没有使用Reachability,但我已经更改了下面的代码以使用" Reachability"而不是我需要加载的10个左右类别。

+ (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();
}

这可以改为-init方法。

我在这里找到了这个解决方案,它对我来说很有用: Objective-C categories in static library