更改符号名称并嵌入位码

时间:2018-07-25 09:34:38

标签: ios linker linker-errors bitcode

tl; dr:我收到此错误消息:

ld: -alias_list and -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES)
cannot be used together

我该如何解决?


我正在尝试创建自己的第三方库版本。我想确保所有调用都不会转到该库的系统版本,因此我使用--alias-list在所有符号上加上前缀,并生成一个头文件,该文件将{{ 1}}至foo。每当我想使用此库时,我的构建系统便会将此头文件包含MJB_foo选项。

这在Android和Linux上效果很好(我很确定它最终也将在Windows上运行)。但是,当我尝试链接共享库时,出现上述错误。如何达到同样的效果?

3 个答案:

答案 0 :(得分:2)

在项目的“构建设置”中,您需要将Enable Bitcode设置为No。对于iOS Apps,位码是默认值,但是可选的,因此您可以不使用位码将应用程序发送到AppStore。

比特码将来会重新优化您的应用二进制文件,而无需向App Store提交新版本的应用。

从Apple Doc:

  

对于iOS应用,位码是默认值,但是可选的。对于watchOS和tvOS应用程序,需要位码。如果您提供位码,则应用程序捆绑包中的所有应用程序和框架(项目中的所有目标)都必须包含位码。

https://help.apple.com/xcode/mac/current/#/devbbdc5ce4f

答案 1 :(得分:2)

我最终要做的是在构建库时以及使用库时强制包含充满#define的头文件。这使我可以从链接器命令行中删除--alias-list,所以很高兴。

遗憾的是,这不是完整的解决方案。该库(它是OpenSSL)具有许多汇编程序模块,因此必须首先通过构建脚本对sed进行修补。

它也有一些可以打开的宏

    FOO(SHA1)

进入

    void SHA1_Init(struct SHA1_CTX *ctx)

问题在于SHA1是我要重命名的功能之一,因此它变成了:

    void MJB_SHA1_Init(struct MJB_SHA1_CTX *ctx)

重命名该函数是无害的(因为事实证明它被统一重命名),但是我没有重命名结构。解决方案是创建另一个小文件,将MJB_SHA1_CTX等重命名为SHA1_CTX

答案 2 :(得分:0)

*为目标启用位码时,链接该目标时使用的所有对象,静态库用户框架必须包含位码。

否则,链接器将发出错误或警告。 (注意:丢失的位码目前是iOS的警告,但它将在即将发布的Xcode中成为错误。)

ENABLE_BITCODE应该为所有目标始终打开。如果您使用第三方提供的库或框架,请与供应商联系以获取包含位代码的更新版本。”

相关问题