Xcode objective-c objective-c++以及混编的理解4

对oc objective-c objective-c++ 混编 的一个大误解

Objective-C++只是源代码,不是一种编程语言,它混合了Objective-C类和C++类(两个完全不相关的实体)

Xcode:11版本

新建工程时,发现我只有objective-c,而没有objective-c++(事实发现的确只有objective-c 也就是oc)
只好选择建了一个objective-c项目
objective-c 是.m后缀的,objective-c++是.mm后缀的,所以后面如果用了或者间接用了C++必须把.cpp或.m文件改成.mm文件

1. 只有objective-c语言,没有objective-c++语言

之前想法是,虽然建的是一个objective-c,但是后面文件后缀都用.mm,应该也没问题

之前觉得Xcode11语言选项只有objective-c,没有objective-c++,可能是因为版本更新了的原因,将其合并了,可以用objective-c项目代替objective-c++,主要是自己第一次接触ios(太天真)

然后在编译过程中,有遇到导入iostream、map等会说not found,思考着这应该是我建的是objective-c工程,但其实前面制作静态库并没有报这些错
解决方案最后并没有采取这种方法,不适合我),不过Xcode版本不同,我操作如下:随便打开一个已有项目(没有自己创一个),点击项目名,点击Build Settings,选择ALL,在Apple Clang-Language下的Compile Sources As那里修改成objective-c++(见下图),这样后面我就可以在文件中导c++里面才有的库文件了,比如说string map vector之类的
我后来发现Xcode11 Compile Sources As编译类型用什么,完全是根据文件类型版本来决定的 完全没必要换,但是当时想着网上既然这么说,肯定有它的道理,就还是跟着换了,然后错误就变成了iostream、map 等 expected unqualified-id,很奇怪的错误
我思考着稍微修改了一下:

#include <iostream>
#include <map>

改成
#ifdef __cplus
#include <iostream>
#endif
#include <map>
这样的修改就是不支持c++,改成下面这个是做一个判断
然后我就明白了,我的工程不支持c++了,当时很懵,因为之前想建一个objective-c++,却没有这个选项,然后在项目里面改成编译类型为objective-c++,但竟然还不行

上面这种改法是objective-c项目,但要稍微用一些c++才有的库,然后可能会这么操作,然而我本身就完全是一个c++项目,不可能这么去做,然后看到这篇博文说:确保编译器是Build Settings->Apple LLVM6.1 - Language->Compile Sources As->已经选择 According to File Type,如果选择了Objective-C++会有很多诡异的编译错误,原因未知,也许和我工程里包含了OpenCV的库有关. 照改,毕竟根据文件类型来选择编译类型没问题一些
在这里插入图片描述

2. iostream、map 等 expected unqualified-id

这个问题上面虽然能解决,但不适合我,确定了就是工程项目建错类型了,所以需要解决为什么我的工程语言的选择只有objective-c,没有objective-c++,毕竟项目主体是C++

困惑1解决:objective-c是oc,而不是c,但是完全兼容c,所以可以直接在里面写c语言语法,但是不能直接在里面写C++
ios开始使用的编程语言主要是objective-c,也就是oc,但是有时候,必须用到c/c++语言
==》1. 很多算法都是以c/c++写成的,如果要使用这些算法库,就会使用到c/c++
==》2. c/c++语言的执行效率优于objective-c,系统对代码执行效率有很高要求时也需要使用c/c++
而xcode支持c/c++,objective-c混合编程。执行混合编程很简单,只要注意将包含c++代码的.m文件改成.mm即可,必须遵守两条规则:
==》1. .m文件不能含有c++代码
==》2. .m文件所import或include的.h文件中不能直接或间接包含c++代码
才明白混合编译是编程语言是objective-c,某些你要用的库只能兼容c++,在objective-c下编译很多错,没法解决,此时我们就选择混合编译,某一些特定部分选择用c++编译,也就是说一个工程一部分用objective-c编译,一部分用c/c++编译
Objective-C++只是源代码,不是一种编程语言,它混合了Objective-C类和C++类(两个完全不相关的实体)。C++代码将像以前一样工作,并且生成的可执行文件将与Objective-C运行时链接,因此您的Objective-C类也会工作

发布了93 篇原创文章 · 获赞 29 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/ljl1015ljl/article/details/103073569