是否可以弱链接静态库(Obj-C)?
我确实希望我的自定义静态框架( MyFramework.framework )弱链接我的其他自定义静态库( libMyLibrary.a )。
libMyLibrary.a 背后的功能是可选的,如果 NO libMyLibrary.a 被任何第三方应用程序链接,则可以省略使用 MyFramework.framework 。
I am using -weak_library
。我的测试应用程序抱怨静态链接器无法在 MyFramework 的MyClass
符号中找到 MyLibrary 的符号ABCTracker.o
:
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
MyClass
中的ABCTracker
来有条件地检查运行时期间的符号可用性,例如NSClassFromString(@"MyClass") == NULL
从 MyFramework 目标&#39> 构建设置我已将Other Librarian Flags
和Other Linker Flags
设置为相同的值{{1} }:
-weak_library MyLibrary
构建之后,我检查了生成的二进制文件中的符号,输出是emty(静态库中没有符号构建到静态框架二进制文件中):
OTHER_LDFLAGS = (
"-weak_library",
MyLibrary,
);
OTHER_LIBTOOLFLAGS = "-weak_library MyLibrary";
尽管如此,我的测试应用程序与 MyLibrary 无关,构建时出现$ otool -L MyFramework.framework/MyFramework | grep MyClass
错误:
ld
我在这里做错了什么?
在 MyFramework 目标中,我将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)
和Other Librarian Flags
设置为相同的值:
Other Linker Flags
。结果:-lMyLibrary
显示库的符号已构建到框架中(预期)。otool
。结果与-weak-lMyLibrary
(预期?)在我的应用目标中,我将lMyLibrary
设置为Other Linker Flags
。结果:链接器错误稍有变化:
-force_load MyLibrary
答案 0 :(得分:1)
我也没有成功地让XCode正确地弱连接静态库,虽然我遇到了与你相反的问题 - 对我来说nm
显示了静态库中的所有符号,而不是“U” “(未定义)符号类型,如您在链接框架时所看到的那样。
但您可以使用的解决方法如下:
-ObjC
添加到链接器标志以确保获得所有符号
已加载(如果您需要非Obj-C符号,则为-all_load
)-weak_framework
添加到其他链接标记)