orbslam移植到ios上----静态库的制作3

前面的准备工作:把orbslam移植到macos上了
现在是:把macos上的c++工程通过Xcode移植到ios真机上

Xcode:11版本

  1. 新建工程

    ios基础认识+新建一个ios工程1
    新建一个ios工程2+工程文件基础认识

  2. 生成.a静态库

    Xcode生成.a静态库,并引用
    更细的对静态库 ios的一个梳理与操作

    静态库文件,如果有多个类,一般是有一个专门的.h文件把其它.h文件全部导入,方便开发者使用
    静态库文件:隐藏.m实现代码
    最后生成的.a文件必须和.h文件一起使用

    我现在是想把DBoW2编译成静态库,然后给我的主程序调用
    1- 先按照上面教程建立一个静态库工程
    2- 然后分别把DBoW2的.h 和 .cpp文件拷贝到新建的工程中
    3- 然后去官网下载一个[opencv2.framwork](https://opencv.org/releases/),然后导入到新建的工程中
    4- 然后像下图这样操作,导入opencv依赖库
    5- 然后点一下项目名,在Build Phases下的Copy Bundle Resources下面添加所有的库文件,这样导出.a文件时,也会导出所有库文件
    6- 编译运行,products下面会生成.a静态库文件
    

    同样的g2o,和上面步骤差不多,只不过g2o需要用到Eigen,然而Eigen没有Framework,自己制作也遇到了一些问题,最终是通过去官网下载Eigen源码,把里面的Eigen文件夹拷贝到/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include下面,然后编译,编译成功后,g2o下面也会生成一个Eigen的文件夹,到时候调用g2o的时候一起拷过去就行

    最终静态库的调用,是要把.a静态库文件和.h .hpp(这个是头文件库文件都写在了一个文件中,一般是可以暴露给外界的,会这么写)拷过去的。在这里插入图片描述
    后面发现还少了一些依赖库没有导进去,Social.framework,Photos.framework,UIKit.framework在这里插入图片描述

  3. 调用静态库文件
    调用的时候,遇到了一些问题,像C++里面的库文件 map vector这些导入都会报错,说:Expected unqualified
    OC工程中使用c++类
    有时我们需要在OC的程序中使用已有的C++类,这时,我们可以把OC类的.m文件后缀改为.mm,就可以在里面使用C++类了。但是二者直接混用会出现一些问题以致编译无法通过,这时可以简单的通过把target中的compile source as改为oc++就可以通过编译。这是一个简单的做法,但两个世界确实很不一样,如此这样的深度混合有时会变地很棘手。

    但是如果使用默认compile类型就在引入C++类后很可能会出错,
    错误通常是这样的:
    Unknown type name ‘class’; did you mean ‘Class’?
    因为class CppObject根本不是有效的Objective-C语法, 所以编译器就被搞糊涂了。正是因为Objective-C中没有class这个关键字. 所以要与Objective-C兼容,Objective-C++类的头文件必须仅包含Objective-C代码,绝对没有C++的代码 - 这主要是影响类型定义。网上的文章已经提到一些解决方案.其中最好的一个是PIMPL,它也适用于现在的情况。这里还有一个适用于clang的新方法,可以将C++代码从Objective-C中隔开,这就是class extensions中ivars的。PIMPL:网上可以找到相关文章,简单来说,就是把#import "CPPObject.h"改成@class CPPObject;,就OK了。

    所以我把在ViewController.mm里面的#import “DBoW.h”换成@class DBoW2;,但是遇到了新的问题:
    在这里插入图片描述

    undefined symbols for architecture x86_64:
      "_UIApplicationMain", referenced from:
          _main in main.o
      "_OBJC_CLASS_$_UIResponder", referenced from:
          _OBJC_CLASS_$_AppDelegate in AppDelegate.o
          _OBJC_CLASS_$_SceneDelegate in SceneDelegate.o
      "_OBJC_CLASS_$_UIViewController", referenced from:
          _OBJC_CLASS_$_ViewController in ViewController.o
      "_OBJC_METACLASS_$_UIResponder", referenced from:
          _OBJC_METACLASS_$_AppDelegate in AppDelegate.o
          _OBJC_METACLASS_$_SceneDelegate in SceneDelegate.o
      "_OBJC_CLASS_$_UISceneConfiguration", referenced from:
          objc-class-ref in AppDelegate.o
      "_OBJC_METACLASS_$_UIViewController", referenced from:
          _OBJC_METACLASS_$_ViewController in ViewController.o
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    
    

    上图的错,最终是通过将Target->Build Settings->Compile Source AS,从Objective-C++改为Objective-C,编译成功的


虽然成功调用了,但是后续的使用过程中还是会遇到许多实际问题:
==》‘new’ file not found
制作静态库过程中,一定要导入在项目 -> tragets -> Link Binary With Libraries -> libc++.tbd ,Xcode10开始不再支持libstdc++.tbd,现在也是默认Build Settings -> Apple Clang - Language -C++ -> C++ Standard Library -> libc++,但是因为可能你导入了一些库之类的,他们以前是libstdc++,要想后面也能使用,一种方法是导入libc++库。

==》.h文件中 ’vector’ ‘iostream’ file not found
网上大部分解决方案是把Compile Sources As设置项修改为Objective-C++,但是这样会引发我其他错误(在后面一篇有写到)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值