![](/img/trans.png)
[英]iOS -weak_library and -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES) cannot be used together
[英]Weakly link static library via -weak_library
是否可以弱链接静态库(Obj-C)?
我确实希望我的自定义静态框架( MyFramework.framework )弱链接我的其他自定义静态库( libMyLibrary.a )。
背后libMyLibrary.a的功能是可选的,如果没有 libMyLibrary.a被使用MyFramework.framework任何第三方应用程序链接可以省略。
我正在使用-weak_library
。 我的测试应用程序抱怨静态链接器无法在MyFramework的ABCTracker.o
符号中找到MyLibrary的符号MyClass
:
Undefined symbols for architecture arm64:
"_OBJC_CLASS_$_MyClass", referenced from:
objc-class-ref in MyFramework(ABCTracker.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
如何正确设置弱链接?
MyClass
ABCTracker
MyClass
有条件地在运行时检查符号的可用性,例如NSClassFromString(@"MyClass") == NULL
从MyFramework目标的Build Settings中,我将Other Librarian Flags
和Other Linker Flags
为相同的值-weak_library MyLibrary
:
OTHER_LDFLAGS = ( "-weak_library", MyLibrary, ); OTHER_LIBTOOLFLAGS = "-weak_library MyLibrary";
构建之后,我检查了生成的二进制文件中的符号,输出为emty(静态库中没有任何符号内置到静态框架二进制文件中):
$ otool -L MyFramework.framework/MyFramework | grep MyClass
尽管如此,我的未与MyLibrary链接的测试应用程序仍会生成ld
错误:
Undefined symbols for architecture arm64: "_OBJC_CLASS_$_MyClass", referenced from: objc-class-ref in MyFramework(ABCTracker.o) ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
我在这里做错了什么?
在MyFramework目标中,我将Other Librarian Flags
和Other Linker Flags
设置为相同的值:
-lMyLibrary
。 结果: otool
显示库的符号已内置到框架中(预期)。 -weak-lMyLibrary
。 结果与lMyLibrary
相同(是预期的吗?) 在我的应用程序目标中,我将Other Linker Flags
设置为-force_load MyLibrary
。 结果:链接器错误略有变化:
ld: file not found: MyClass
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我也没有成功地使XCode正确弱链接静态库,尽管我遇到了与您相反的问题-对我来说, nm
显示了静态库中的所有符号,而不是“ U”(未定义)符号类型当您弱连接框架时,您会看到。
但是,可以使用以下解决方法:
-ObjC
到链接器标志中,以确保所有符号-all_load
加载(如果需要非Obj-C符号,则添加-all_load
) -weak_framework
将其添加到Other Linker Flags )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.