iOS SDK开发时,有关OC和C++混编造成其它类错误的问题(Compile Sources As Objective

综合技术 2017-11-15

.h :头文件。头文件包含类,类型,函数和常数的声明。

.m :源代码文件。这是典型的源代码文件扩展名,可以包含Objective-C和C代码。

.mm :源代码文件。带有这种扩展名的源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码。仅在你的Objective-C代码中确实需要使用C++类或者特性的时候才用这种扩展名

当你需要在源代码中包含头文件的时候,你可以使用标准的#include编译选项,但是Objective-C提供了更好的方法。#import选项和#include选项完全相同,只是它可以确保相同的文件只会被包含一次。Objective-C的例子和文档都倾向于使用#import。

最近要帮忙做一个SDK,主体功能已经实现,是用C/C++编写的,所以导入这个SDK库到新项目中,程序需要有以下设置才能不会报错:

项目-Targets-Build Settings Apple

LLVM 6.0 -Language

-Compile Sources AS:

C++ Language Dialect 和 C++ Standard Library

这么做后,.a静态库文件都能编译通过,但是问题来了,如果项目中引用到了其它的第三方库文件,可能会产生错误,如下图所示:

就是很莫名其妙的就出现了问题,经过调试发现,原来是Compile Sources As 设置为 Object-C++所导致的,也就是说编译器开始识别C++了,而ObjectiveC部分参数识别不了,所以就各种错误了。

相信有的朋友在使用百度地图api的时候,添加lib库也会遇到类似的问题:

那么到底该如何解决呢?如果切换回 According To File Type ,那么lib库(SDK库)就会报错,切换成C++,部分第三方库就会出差,该怎样混编兼容呢?接下来我给出一种方案,具体如下:

1, Compile Sources As 切换回

According to File Type

,这样能保证其它的第三方库、以及之后可能添加的不同类型源码文件都没有问题,我们以文件类型来动态编译(也就是说是oc文件,就用oc编译,是C++文件,就以C++编译)

2,在新项目中,把

AppDelegate

或是

引用到lib库

的那个文件或是任意一个文件后缀修改成

.mm

,这样,系统编译时就可以识别到C++了,我们自己的lib库也不会出错了~

【PS:如果AppDelegate中有其它调用,修改成.mm后缀会引起错误,那么就修改其它的文件】

3,此时在运行项目,是不是都没问题了?第三方库也不会报错了(跟Compile Sources As有关),我们自己的lib库、SDK也不会报错了~

注意事项

1.静态库中如果有采用ObjectC++实现,那么需要您保证您工程中至少有一个 .mm 后缀的源文件(您可以将任意一 个 .m 后缀的文件改名为 .mm ),或者在工程属性中指定编译方式,即将XCode的Project -> Edit Active Target -> Build Setting-> GCC4.2 - Language -> Compile Sources As设置为" Objective-C++ "

2.如果您只在Xib文件中使用了目标lib库(比如BMKMapView),没有在代码中使用它(BMKMapView),编译器在链接时不会链接对应符合,需要在工程属性中显式设定:在XCode的Project -> Edit Active Target -> Build -> Linking -> Other Linker Flags 中添加: -ObjC

CocoaChina

责编内容by:CocoaChina (源链)。感谢您的支持!

您可能感兴趣的

IOS状态栏和导航栏的控制问题 IOS的项目多数会遇到控制状态栏和导航栏的问题,比如隐藏状态栏、控制状态栏的文字颜色等,导航栏也有同样需求。本文总结一下操作方法。 首先一点,IOS的界面分...
一个ios程序员年后找工作经历(附上一些面试问题)... 年头辞职换工作的事情在这金三银四的时候屡见不鲜,我呢,一个ios开发者。3月份辞职后旅游几天,四月份第一个礼拜开始投简历,只在某钩投,简历样式是附件简历,...
Machine Learning with ML.Net and C# Index Supervised Machine Learning Binary Classif...
IOS7 System Volume Control (Ring and Aler... This question appears to be asked and answered many times but with no specific o...
Augmento – a social path time machine built ... This is a guest post by Ed Arenberg . Ed built one of the top entries at the Hy...