相关文章推荐
体贴的板凳  ·  Python ...·  2 年前    · 

Swift、Objective-C以及C++混编开发framework

为什么要写这么一篇文章呢?公司是做室内地图引擎的,原来的引擎是用c++底层实现,上层使用Objective-C实现。最近需要做一个swift版的引擎,所以就研究了一下如何用swift和C++混编打包framework。

swift和Objective-C的混编网上一搜一大堆教程,这里就不再赘述了,下面进入正文。

这篇文章主要讲解了swift、Objective-C和C++混编framework。

swift和C++混编

在这里很遗憾的告诉大家swift并不能直接调用C++,也许是我一知半解吧或者是技术水平不够,如果有人知道如何直接调用的话请告诉我。

Objective-C和C++混编

将c++文件导入到工程中,在需要引用c++的OC文件中将.m后缀改为.mm,引用头文件即可。如果c++是静态库的形式,那么需要在building setting中设置library search path

swift Objective-C C++混编

这种方式也仅仅是为了swift能够调用c++方法。因为swift不能直接调用c++,,但是却可以与OC相互调用,而正好OC也可以调用C++,swift就可以通过OC 来调用C++方法。
如果不关心头文件的暴露问题,那么可以使用下面的方法。

  1. 新建一个swift版本的framework工程,此处工程命名为SLTestFramework;
  2. 新建一个OC文件;

    @interface OCTest : NSObject
    - (void)log;
    
        #import "OCTest.h"
        @implementation OCTest
        - (void)log {
            NSLog(@"output log");
    

    3. 为了让Swift文件访问Objective C文件,我们应该在umbrella header,也就是SLTestFramework.h中,暴露所需要的header。

         #import <SLTesFramework/OCTest.h>
    

    4. 修改OC文件权限;在target->build phases->headers中将OC文件的project权限改为public,直接拖入public即可修改。

    参考图片
    5. 编译生成framework即可。

    这种方式生成的库会将OC的头文件暴露出来,若内部使用则没问题。若需要隐藏OC的内部实现细节则需要采用下面的打包方式。

    此种方式通过modulemap文件实现引用,隐藏OC相应接口,提高隐秘性,适合对外发布。

    1. 与上述方法1 2步骤相同
    2. 新建一个modulemap文件,内容如下

          module OCSwift [system] {
          //由于module.modulemap和OCTest.h是在同一个文件夹的,如果不是同一个,路径要写全
          header "OCTest.h"
          export *
      

      }

    3. 设置modlemap文件的路径;
    4. 完成。

      demo已上传至CSDN

    Swift、Objective-C以及C++混编开发framework序言为什么要写这么一篇文章呢?公司是做室内地图引擎的,原来的引擎是用c++底层实现,上层使用Objective-C实现。最近需要做一个swift版的引擎,所以就研究了一下如何用swift和C++混编打包framework。swift和Objective-C的混编网上一搜一大堆教程,这里就不再赘述了,下面进入正文。...
    对于Swift的出现,估计很多公司很多人都面临着原有开发框架的更新换代,Swift经过一年的发展,到现在2.1版,显而易见的大坑填的差不多了,算是基本堪以大用了,这场景让我恍惚回到使用.Net 2.0架构软件系统的年代,都是刚算够上堪以大用,可以引入企业级开发了,可以考虑构建稳固版本计划和投入资源实施了。 现在问题场景是很多原有Framework,都是基于OC的,其中Framework积累大
    本人并未深入研究过 Android的framework和从事framework开发,以下内容都是我根据网络上各路大神的博客、知乎和B站视频所讲述的内容,以及我自己的理解整理而成,这其中极可能会有错误,各位看官要小心!!! 1. android应用程序到底层驱动的流程 apps-->java api frameworks-->android runtime(ART即虚拟机)-->Native C/C++ library -->...
    一个框架(Framework)就是一个软件包,它包含了多个类。 Mac操作提供了几十个框架,从而帮助我们快速地在Mac系统上开发应用程序。 在这些框架中,有一些称为基础框架,其中的类包括:字符串(NSString)、数字(NSNumber)、数组(NSArray)、字典(NSDictionary)、集合(NSSet)等。 所有基础框架上的类都同用户界面无关。 为了使用这些类,需要在程序中,
    最近遇到一个问题,将含有C++文件的代码打包成framework时,打包时正常,但是不能正确接入到项目中使用,一直报如下错误 Undefined symbols for architecture arm64: , referenced from: 排查了很久,确定头文件和framework的路径都没有问题后,确定是打包引入的C++文件所导致的,如果坚持要包含C++并且打包成framework,可...
    #import "工程名-Swift.h" Swift调用 Object-C 创建Swift文件的时候,会出现问是否要创建Bridging-header.h.当然点击Yes。 把你要引用的oc文件头文件写到里面就可以了。在Swift文件里就可以引用了。 调用C++Object-c文件改成
    C++要求同一对象、函数、类等的类型在所有声明(declaration)中必须保持一致,通过将接口信息放在文件中并在源文件中#include头文件的方法实现这一要求。 包含C++头文件有两种形式 #include <filename> #include “filename” 两种形式都会将头文件的内容替换在当前行。 两种形式的区别: #1 – 以具体实现定义的顺序查找头文件, 即查找标准目录。 #2 – 先查找当前目录,然后是标准目录。 C++的头文件是没有后缀的,即没有”.h”
    苹果推出Swift后,很快就受到程序猿的青睐,快速、安全、简洁的开发已经是一个大趋势了。如果在加上C和C++真的是天衣无缝了,完美结合。对于Swift调用C和C++,通常需要OC做桥接(oc调用c和c++),性能得不到优化。我们今天直接用Swift调用C使性能得到全面的提升。苹果号称和C一样快的Swift的demo我们来粒子。 测试环境: Xcode版本:11.0-beta Swift版...
    前言为什么要写这样一篇文章,因为昨天和一个朋友讨论到SwiftObjective C如何混合开发Framework,中途发现了很多有意思的坑。用Swift封住哪个OC的库是一件比较常见的事情,毕竟对于大多数公司来说,老的代码都是用OC写的,而且经过多次迭代,这些OC的代码已经被验证了是稳定的,用Swift重写代价太大。这就引入了一个需求: 用SwiftOC混编一个Framework
    OCSwift、C、C++可以互相调用,也可以混合编程,只需要注意一些规则和配置即可。 mm文件中的C++,其实是objective c++,并不算严格意义上的C++ cpp文件可以在xcode中直接编译 swift不支持C++混编,也不能调用C++的类或者函数,得用OC包一层。倒是可以调用C的函数,可能是C++的语法太复杂了。 如果是.m文件,可以用OC和C的代码; 如果是.mm文件,可以用OC和C和C++的代码;.m 和.mm 的区别是告诉编译器在编译时要加的一些参数。 PIMPL ...
    iOS项目中的核心用c++的库,例如ffmpeg,那么如何在Swift中调用c++库就是一个大问题了。因为Objective-cc++都是c体系,他们两之间的调用还算是方便。所以,要首先要解决的是Swiftobjective-c之间的调用问题。 Swift中调用Objective-c 创建一个工程 点击 file->new->file 添加一个 Header File ,起名为 FunctionFromOC,如下图所示: 添加以下代码 #ifndef FunctionFromOC.
    这个话题并不是一个新的话题,网上有前辈做过详细的描述(Mixing Objective-C, C++ and Objective-C++: an Updated Summary)。之所以做为一篇文章,是因为在实际项目中用到了这种混合,加以记录。 首先需要澄清的是,Objective-C是strict superset of C. C++是基于C语言的面向对象的扩充,但不是strict s