Yev*_*nin 9 xcode linker objective-c static-libraries ios
是否可以弱连接静态库(Obj-C)?
我确实希望我的自定义静态框架(MyFramework.framework)弱链接我的其他自定义静态库(libMyLibrary.a).
libMyLibrary.a背后的功能是可选的,如果没有 libMyLibrary.a被任何使用MyFramework.framework的第三方应用程序链接,则可以省略.
我在用-weak_library.我的测试应用抱怨说,静态链接无法找到在MyLibrary的符号MyClass内MyFramework S' 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)
Run Code Online (Sandbox Code Playgroud)
如何正确设置弱链接?
MyClassMyClass其自己的类ABCTracker有条件检查符号可用性运行时,如NSClassFromString(@"MyClass") == NULL从MyFramework目标的生成设置我已设置Other Librarian Flags并Other Linker Flags以相同的价值-weak_library MyLibrary:
OTHER_LDFLAGS = (
"-weak_library",
MyLibrary,
);
OTHER_LIBTOOLFLAGS = "-weak_library MyLibrary";
Run Code Online (Sandbox Code Playgroud)在构建之后,我检查了生成的二进制文件中的符号,输出是emty(静态库中没有符号构建到静态框架二进制文件中):
$ otool -L MyFramework.framework/MyFramework | grep MyClass
Run Code Online (Sandbox Code Playgroud)尽管如此,我的测试应用程序没有与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)
Run Code Online (Sandbox Code Playgroud)我在这做错了什么?
在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)
Run Code Online (Sandbox Code Playgroud)
我也没有成功地让 XCode 正确地弱链接静态库,尽管我遇到了与你相反的问题 - 对我来说nm显示了静态库中的所有符号,而不是像你一样使用“U”(未定义)符号类型看看你什么时候弱链接一个框架。
但您可以使用的解决方法如下:
-ObjC到链接器标志以确保加载所有符号(-all_load如果您需要非 Obj-C 符号)-weak_framework阶段中删除并通过Other Linker Flags添加)| 归档时间: |
|
| 查看次数: |
663 次 |
| 最近记录: |