相关疑难解决方法(0)

通过-weak_library弱链接静态库

题:

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

简短细节

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

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

我在用-weak_library.我的测试应用抱怨说,静态链接无法找到在MyLibrary的符号MyClassMyFramework 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)

如何正确设置弱链接?

全部细节

建立

  • Xcode项目构建一个静态Mach-O二进制文件并将其捆绑到一个静态框架中.结果是MyFramework.framework包.
  • 其他项目构建一个静态的Mach-O二进制文件,结果是一个静态的lib文件libMyLibrary.a,带有一个标题MyLib.h
  • libMyLibrary.a将从MyFramework.framework目标的Build Phases > Link Binary With Libraries中删除( …

xcode linker objective-c static-libraries ios

9
推荐指数
1
解决办法
663
查看次数

ObjC:如何编译包含依赖于第三方库的可选类的静态库

我正在尝试找到打包静态库的最佳方法(让我们称之为Lib1),其中包含一个可选类(比如ClassA),它本身需要第二个静态库(Lib2).换句话说,只有在项目代码中引用ClassA时才需要Lib2.事情似乎工作正常,除非Lib1用于不使用ClassA的项目(因此不包括Lib2),但需要-ObjC链接器标志(因为其他项目依赖项,而不是我的).

我正在尝试为以下三种情况提出一个简单的解决方案:
1)项目包括我的静态lib,不使用可选类,不指定-ObjC标志
2)项目包括我的静态库,不是使用可选类,但需要-ObjC标志
3)项目包括我的静态lib +第二个静态库,而DOES使用可选类(此时我们不关心-ObjC标志)

是否有一个链接器标志从最终项目应用程序中删除我的可选类,以便它不需要第二个静态库?我想我的其他选择是发布我的静态库的多个版本,一个包含选项类(标准选项),一个不包含(替代,对于具有-ObjC要求的项目),或者可能提供存根文件,提供第二个静态库所需的所有类的空实现?这似乎可能是静态库世界中的常见问题...这种情况是否有最佳实践?

谢谢!


解:

1)建议我的-ObjC用户使用-force_load.(感谢Rob!)
2)对于不能做1的用户,我将使用不包含ClassA的备用版本

linker objective-c static-libraries static-linking

7
推荐指数
1
解决办法
3602
查看次数

我是否需要链接依赖关系链接的库?

我正在尝试使用Xcode在Objective C和C++中为iOS编写一个简单的游戏引擎.

我做了一个游戏项目和一个游戏引擎项目.后者作为子项目添加到前者中.该引擎还作为目标依赖项添加,并作为二进制文件添加到游戏项目中.

我的引擎使用CADisplayLink所以我添加QuartzCore.framework了引擎项目的"链接二进制文件库列表"(在构建阶段中找到).

现在,当我尝试构建我的游戏项目(带有子项目的项目)时,我收到此错误:

Undefined symbols for architecture i386: "_OBJC_CLASS_$_CADisplayLink", referenced from: objc-class-ref in libVoya-iOS.a

此错误仅在从游戏项目构建时发生 - 从引擎项目中执行此操作正常.如果我添加QuartzCore.framework到游戏项目建设工作正常.

它真的是真的我必须特别要求我的目标依赖项之一已经需要的框架吗?在这种情况下:我的引擎(子项目)已经链接了QuartzCore - 是否真的有必要在使用此引擎的项目中执行此操作?感觉就像无缘无故的双重工作.

或许我只是完全误解了什么?:)

xcode cocoa static-linking

2
推荐指数
1
解决办法
883
查看次数