繁体   English   中英

使用Objective-C框架的Swift Project

[英]Swift Project using objective-c framework

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

在此处输入图片说明

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

出于这个原因,我们实际上需要一个链接器标志,而进入此问题的原因在下面从此链接摘录的部分中进行了定义:

链接器

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

当源文件使用另一个文件中定义的内容(如函数)时,会将未定义的符号写入目标文件,以“站在”丢失的内容中。 链接器在构建最终的可执行文件时,通过提取包含未定义符号定义的目标文件来解析这些符号。

例如,如果main.c使用函数foo(),其中foo是在另一个文件Bc中定义的,则目标文件main.o将具有foo()的未解析符号,而Bo将包含foo()的实现。 )。 在链接时,Bo将进入最终的可执行文件,因此main.o中的代码现在引用Bo中定义的foo()的实现。

UNIX静态库只是对象文件的集合。 通常,链接器仅在可以解决一些未定义符号的情况下才从静态库中提取目标文件。 不拉入所有目标文件会减小最终可执行文件的大小。

目标C

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

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

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

-ObjC链接器标志

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

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

一个避免链接程序问题的简短过程是添加-all_load (请参阅此标志的作用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM