‘iostream’ file not found
大部分出现在OC和C++混编的时候,根据StackOverflow的回答多数提到了三点
- 更改 Build Setting 里的 C++ Standard Library 或 C++ Language Dialect(无效)
- 更改 Build Setting 里的 Compile Source As 为 Object-C++(有效)
- 引用文件改为.mm (有效)
其中真正解决问题的是第二和第三种方式,但是它们都没有指出问题的根源
头文件的引用无序,导致以Objective-C进行Compile的文件引用了C++的头文件
Compile Source As
更改这个选项为 Object-C++ 是把任何源文件都以C++和Object-C混编的方式进行Compile
但是不推荐使用这个方法,是因为会带来一系列的编译器语法检查问题,例如
1 | //Object-C 可以通过 |
引用文件改为.mm
当时候 .mm 作为后缀名时,该文件会自动使用C++的Compile进行编译
头文件引用混乱报错
假设存在以下文件——Cplus.h——Cplus.mm——OCNormal.h——OCNormal.m
1 | //Cplus.h |
正常情况下
- Cplus.mm作为Object-C++编译,可以正确引用 Cplus.h 中的
不报错 - OCNormal.m作为Object-C编译,引用了OCNormal.h,其中OCNormal.h由于引用了Cplus.h,引入了
所以在以上情况下,OCNormal这个Object-C文件错误加载了C++的头文件,导致 Cplus.h中的
经常出现在,Framework中的部分功能是由C++提供的,但是在umbrella的头文件中加入了C++的头文件,外部工程直接引用umbrellato头文件报错
CocoaPods 与 Swift 使用C模块
在解决C模块引用的时候查询到 modulemap的知识,很多人用于解决
不过感觉这两个答案都是没管理好头文件暴露导致的,没有仔细看