前面的准备工作:把orbslam移植到macos上了
现在是:把macos上的c++工程通过Xcode移植到ios真机上
Xcode:11版本
-
新建工程
-
生成.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
-
调用静态库文件
调用的时候,遇到了一些问题,像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++,但是这样会引发我其他错误(在后面一篇有写到)