Ios 针对应用程序和测试目标的链接框架

Ios 针对应用程序和测试目标的链接框架,ios,objective-c,xcode,objective-c-runtime,sentestingkit,Ios,Objective C,Xcode,Objective C Runtime,Sentestingkit,我在我的普通应用程序目标以及相应的UnitTest目标中使用了一个自定义框架。事实证明,这会混淆运行时,使其无法选择正确的实现,因为它有多种选择: objc[35580]: Class AClass is implemented in both ../MyApp.app/MyApp and ../MyApp.app/MyAppTests. One of the two will be used. Which one is undefined. 如果您试图检查对象的类层次结构或执行任何其他与类相

我在我的普通应用程序目标以及相应的UnitTest目标中使用了一个自定义框架。事实证明,这会混淆运行时,使其无法选择正确的实现,因为它有多种选择:

objc[35580]: Class AClass is implemented in both ../MyApp.app/MyApp and ../MyApp.app/MyAppTests. One of the two will be used. Which one is undefined.
如果您试图检查对象的类层次结构或执行任何其他与类相关的检查,这当然会导致奇怪的行为

因此,它归结为以下两个问题:

  • 我没有看到类似的日志,例如UIKit组件,但是这个框架也链接到这两个目标。我是否错误地编译了框架
  • 这只是我错过的一个微不足道的配置问题吗

  • PS:我已经检查过类似的帖子,如或,但尽管所有内容都按照描述进行了配置,问题仍然存在。

    我认为捆绑包应该只“读取”框架的头文件,而不构建源文件,并将该任务留给应用程序(从UnitTest目标中删除框架
    .m
    文件)


    现在,应用程序和UnitTest都在构建框架,因此复制的类也在构建中。

    您已经将依赖关系框架添加到了测试目标中。这是有缺陷的想法。由于您的主应用程序也导出相同的框架,因此您将收到关于框架中发现的任何类的重复符号的警告


    通过从测试目标中删除框架,可以解决警告问题。请记住,您不会因为没有链接到测试目标中的同一个框架而丢失任何功能。相信我,您的代码仍然存在。

    我在这里遇到了类似的问题:


    关键是创建一个新的单元测试包,将它指向您的原始目标,然后不做任何其他事情!如果您开始在测试目标中包含框架和源文件,它将生成这些链接错误。测试目标应该将测试类“注入”到实际目标中,而不是自己创建一个新的单独目标。因此,您只需要导入测试类中的头文件,并编写测试用例

    这是因为您创建的框架是静态链接的,而不是动态链接的。如果你只是不链接测试包中的框架,它应该可以工作,但是你仍然需要标题。但是如果我需要一些我在应用程序中不使用但在测试中使用的对象,这些对象在链接测试时会从应用程序中剥离,该怎么办?如果只包含头,则会遇到链接器错误。您的链接器错误很可能是另一个生成配置问题。理查德是对的。您应该在应用程序中针对您的框架进行链接,而不是在单元测试中。如前所述修复框架链接问题,然后分别解决其他链接问题。能否发布两个目标的框架搜索路径?可能问题在于,到框架的链接是硬编码的,不是动态的($SRCROOT)。他们不是在构建框架,而是预先构建的。这就是使用框架的全部意义。相反,两者都显式链接框架。如果您正在构建应用程序的测试,那么该产品必然是一个依赖项。如果我们没有.h和.m文件,那么Swift呢?没有,因为我没有在正常的测试目标中使用我需要的部分。这样我就遇到了链接器错误。你是说你只需要在测试中使用框架的一部分吗?在这种情况下,我将构建框架的发布和测试版本,并在编译时链接到正确的框架,再次确保只链接一次框架。