我有一个链接到我的静态库的应用程序。
我刚刚将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动态库?
答案 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