【问题标题】:Modifying a Compiled Static Library修改已编译的静态库
【发布时间】:2012-04-19 16:09:06
【问题描述】:

戴上你的 c++ ninja voodoo 手套。

我们购买了一个第三方库以在我们的 iOS 应用中使用。该库有 2 个版本,所以我们称它们为 bull_frog_noises.atoad_frog_noises.a

公司从未想过有人会在单个应用程序中制作两种青蛙的声音,因此每个库都提供相同的方法名称

MAKE_FROG_NOISE();

有没有办法重建或修改这些库,以便它们都可以在不相互冲突的情况下使用?这是理想的状态:

MAKE_BULL_FROG_NOISE();
MAKE_TOAD_FROG_NOISE();

【问题讨论】:

  • 你不能在ios中动态加载一个lib。它们与应用程序一起编译,因此您无法在未通过苹果批准流程的情况下为应用程序提供更多功能。
  • 感谢 Raphael - 我不希望人们过于沉迷于动态加载的想法,所以我删除了这部分问题。

标签: c++ objective-c c ios xcode


【解决方案1】:

我会尝试使用十六进制编辑器手动修改其中一个库,以便将每个 MAKE_FROG_NOISE 实例替换为 MAKE_TOAD_NOISE。您必须非常小心才能只进行那一项更改。您只能替换字节。不要插入或删除任何东西。并且不要更改文件中的任何其他内容。

【讨论】:

  • 这行得通,但很棘手。如果它们相互冲突,您已经重命名了您使用的方法和它使用的私有方法。无论如何,我使用Hex Fiend 重命名每种方法的一个字母,现在我可以并排运行它们。
【解决方案2】:

您可以使用您想要的方法名称构建另一个静态库作为这些库的包装器,然后将包装器库包含在项目中。

像这样:

1 - 创建一个名为 Bull_frog_noises_wrapper.a 的新静态库项目。

2 - 包含 Bull_frog_noises.a 作为对这个新创建的库的依赖项。

3 - 创建这样的方法:

void MAKE_BULL_FROG_NOISE()
{
    MAKE_FROG_NOISE();
}

4 - 对 toad_frog_noises.a 执行相同操作,创建如下方法:

void MAKE_TOAD_FROG_NOISE()
{
    MAKE_FROG_NOISE();
}

5 - 在您的项目中添加这些包装器,您就完成了。

请注意您在主项目中使用的头文件,以免它们与内部库冲突。

希望对你有帮助。

【讨论】:

  • 那么这会阻止图书馆的内部运作相互践踏吗?例如,如果两个MAKE_FROG_NOISE() 方法都调用了类似PREPARE_NOISE() 的方法怎么办?会调用正确的方法吗?
  • 这并不能解决问题,因为一切仍然需要链接在一起,这就是发生碰撞的地方。
  • 这就是我告诉创建 2 个独立库的原因。每个库都将独立构建。 toad_frog_noises.a 包含一组仅包含在 toad_frog_noises_wrapper.a 中的标头,其他库也将这样做。方法的链接部分出现在包装库中,而不是项目本身。
  • 对于您购买的库中的所有方法,您必须在包装库中创建相应的方法,因此在调用 PREPARE_NOISE() 的地方,您应该调用 PREPARE_TOAD_NOISE() 或 PREPARE_BULL_NOISE() 和这些方法都将调用 PREPARE_NOISE(),但在它们自己的库中。
  • 看来这行不通。我在 XCode 中创建了一个Cocoa Touch Static Library,导入了bull_frog_noises.a,并用MAKE_BULL_FROG_NOISE() 包裹了它。与其他库相同,然后将两者都导入我的项目中。一个有效,但另一个失败。恐怕两者都调用了像PREPARE_NOISE() 这样的私有方法,并且创建一个包装器并不能解决这个问题。我错过了什么吗?
猜你喜欢
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 2016-06-18
相关资源
最近更新 更多