最近要帮忙做一个SDK,主体功能已经实现,是用C/C++编写的,所以导入这个SDK库到新项目中,程序需要有以下设置才能不会报错:
项目-Targets-Build Settings Apple LLVM 6.0 -Language-Compile Sources AS:
C++ Language Dialect 和 C++ Standard Library
将编译方式设置成ObjectIve-C++,sdk的移植不会报错,但是如果项目中引用到了某些第三方的库,就是很莫名其妙的就出现了问题,经过调试发现,原来是Compile Sources As 设置为 Object-C++所导致的,也就是说编译器开始识别C++了,而ObjectiveC部分参数识别不了,所以就各种错误了常见的是AsynSocket通讯类库。
那么怎么才能既兼容c++的库,又兼容oc的库了?
1,Compile Sources As 切换回According to File Type,这样能保证其它的第三方库、以及之后可能添加的不同类型源码文件都没有问题,我们以文件类型来动态编译(也就是说是oc文件,就用oc编译,是C++文件,就以C++编译)
2,在新项目中,把AppDelegate或是引用到lib库的那个文件或是任意一个文件后缀修改成.mm,这样,系统编译时就可以识别到C++了,我们自己的lib库也不会出错了~
终结:
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中添加:-Ob