【问题标题】:Swift Project using objective-c framework使用 Objective-C 框架的 Swift 项目
【发布时间】:2015-12-18 10:08:29
【问题描述】:

我有一个用objective-c和c++编写的自定义框架,现在,我尝试在我的swift项目中使用这个框架。我想我正确配置了桥接头文件。但在编译项目时仍然会出现这些错误。

【问题讨论】:

  • 您是否正确设置了链接器标志(如果有)?
  • @NeverHopeless 是的,"-ObjC"
  • 尝试添加-lc++链接器标志。
  • @NeverHopeless 它有效!你能解释一下吗?我用谷歌搜索了它,但一无所获。
  • OP,请看我的回答。

标签: c++ ios objective-c swift


【解决方案1】:

如果通过 pod 安装,请确保在类文件中使用 import 框架。示例:导入 Cloudinary。

【讨论】:

    【解决方案2】:

    我们实际上需要一个链接器标志并且我们遇到这个问题的原因在下面从this link的部分中定义:

    链接器

    当一个 C 程序被编译时,每个“源文件”都会变成一个 包含可执行函数和静态数据的“目标文件”。这 链接器将这些目标文件粘合在一起成为最终的可执行文件。那 Xcode 最终将可执行文件捆绑到应用程序中。

    当一个源文件使用在另一个文件中定义的东西(如函数)时 文件,然后将未定义的符号写入目标文件,以 “代替”丢失的东西。链接器通过以下方式解析这些符号 拉入包含未定义定义的目标文件 构建最终可执行文件时的符号。

    例如,如果 main.c 使用函数 foo(),其中 foo 被定义 在另一个文件 B.c 中,目标文件 main.o 将有一个 foo() 的未解析符号,并且 B.o 将包含一个实现 富()。在链接时,B.o 将被带入最终的可执行文件,所以 main.o 中的代码现在引用了 foo() 的实现 在 B.o. 中定义

    UNIX 静态库只是目标文件的集合。一般 如果这样做,链接器只会从静态库中提取目标文件 所以会解决一些未定义的符号。不拉入所有物体 文件减小了最终可执行文件的大小。

    目标-C

    Objective-C 的动态特性使事情稍微复杂化。因为 实现方法的代码直到方法才确定 实际调用时,Objective-C 没有定义链接器符号 方法。链接器符号仅为类定义。

    例如,如果 main.m 包含代码 [[FooClass alloc] initWithBar:nil];那么 main.o 将包含一个未定义的符号 FooClass,但 -initWithBar: 方法没有链接器符号 在 main.o 中。

    由于类别是方法的集合,因此使用类别的 方法不会生成未定义的符号。这意味着链接器 不知道加载定义类别的目标文件,如果 类本身已经定义。这会导致相同的“选择器不 识别的”运行时异常,您将看到任何未实现的 方法。

    -ObjC 链接器标志

    将 -ObjC 选项传递给链接器会导致它加载所有成员 实现任何 Objective-C 类或类别的静态库。 这将拾取任何类别方法实现。但它可以使 生成的可执行文件更大,并且可能会拾取不必要的对象。 因此默认情况下它是不开启的。

    出于同样的原因,当我们必须包含 c++ 功能时,我们必须为-lc++ 添加链接器标志(请参阅this url)。 (AFAIK,如果您排除 c++ 功能 -lc++ 标志将不需要)

    避免链接器问题的一个简短过程是添加-all_load(请参阅what does this flag do

    这些是我对这个问题的发现,希望有所帮助!

    【讨论】:

    • 谢谢,帮了大忙,你让它像水晶一样清晰。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 2018-09-17
    • 1970-01-01
    • 2018-11-07
    • 2018-12-10
    • 1970-01-01
    相关资源
    最近更新 更多