ios – 通过-weak_library弱链接静态库

题:

是否可以弱连接静态库(Obj-C)?

简短细节

我确实希望我的自定义静态框架(MyFramework.framework)弱链接我的其他自定义静态库(libmyLibrary.a).

libmyLibrary.a背后的功能是可选的,如果没有libmyLibrary.a由任何使用MyFramework.framework的第三方应用程序链接,则可以省略.

I am using -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)

如何正确设置弱链接

全部细节

建立

> Xcode项目构建一个静态Mach-O二进制文件并将其捆绑到一个静态框架中.结果是MyFramework.framework包.
>其他项目构建一个静态Mach-O二进制文件,结果是一个静态lib文件libmyLibrary.a,带有一个标题MyLib.h
> libmyLibrary.a已从MyFramework.framework目标的Build Phases>中删除. Link Binary with Libraries(as suggested here).只有MyLib.h可以从框架的类中使用库的API
> NO Bitcode既不用于框架,也不用于库中
> MyFramework.framework,libmyLibrary.a和自定义应用程序都是用Objective-C编写的
> MyLib.h只定义了一个Objective-C类MyClass
> MyFramework.framework使用自己的类ABCTracker中的MyClass,在运行时有条件地检查符号可用性,例如: NSClassFromString(@“MyClass”)== NULL
>从MyFramework目标的构建设置我已将其他图书馆员标志和其他链接器标志设置为相同的值-weak_library MyLibrary:

OTHER_LDFLAGS = (
    "-weak_library",MyLibrary,);
OTHER_LIBTOOLFLAGS = "-weak_library MyLibrary";

结果

> MyFramework.framework构建正常
>构建之后,我检查了生成的二进制文件中的符号,输出是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目标中,我将其他Librarian Flags和Other Linker Flags设置为相同的值:

> -lMyLibrary.结果:otool显示库的符号已构建到框架中(预期).
> -weak-lMyLibrary.结果与lMyLibrary相同(是否可以?)

在我的应用程序目标中,我将其他链接器标志设置为-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”(未定义)符号类型你看到什么时候你弱连接一个框架.

但您可以使用的解决方法如下:

>创建一个名为MyWrapper.framework的新Cocoa Touch Framework项目,并向其添加libmyLibrary.a>将-ObjC添加链接器标志以确保获得所有符号加载(如果需要非Obj-C符号,则为-all_load)>将库的标题添加到Build Phases中框架的Public Headers部分>构建此框架(您将要为所有体系结构设置聚合目标,但这是一个完全独立的主题)>打开MyFramework.framework项目并向其添加MyWrapper.framework,弱链接(即使用切换将其设置为Optional,或者如果您更喜欢将其从Link Binary with Libraries阶段删除,并通过-weak_framework将其添加到Other Linker Flags )>现在构建MyFramework.framework>在您的测试应用中,删除libmyLibrary.a的任何引用>您应该能够运行您的测试应用程序而不会崩溃,并且您的代码不应检测libmyLibrary.a中是否存在符号>将MyWrapper.framework添加到您的测试应用程序,然后您应该看到相反的结果 – 来自libmyLibrary.a的符号将被找到并可用.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...