昨天升级了一下Xcode6,遇到了两个问题。
第一个,无法准确识别IOS device。始终显示为Unavailable。
这个问题呢..应该是Xcode6Beta版本的小故障,当年Xcode5刚出来的时候也这样。你可以选择将Xcode退出,确保手机已经连接上Mac,再次启动Xcode来解决这个问题。
当然如果这个办法无法解决问题,你也可以通过将iTunes升级到最新版本来解决这个问题。
第二个问题,cocos2dx3.1以下版本在Xcode6的IOS框架下编译出错,主要是三个Error
编译器告诉我们在libcocos2dx——也就是cocos2dx库中用到的_fwrite$UNIX2003以及_strerror$UNIX2003未被定义。
那么我们可以猜测,这次的Xcode升级有可能将原有的这两个类C语言模块从UNIX内核里删掉了(不要问为什么会出现UNIX...因为mac OS就是一个做的比较漂亮的Unix而已..)
我们可以通过extern""的方式对他们进行定义
extern "C"{ size_t fwrite$UNIX2003( const void *a, size_t b, size_t c, FILE *d ) { return fwrite(a, b, c, d); } char* strerror$UNIX2003( int errnum ) { return strerror(errnum); } }
——————————————————————————————————————————————————————————————————————
插播一段C语言小知识
被extern限定的函数或变量是extern类型的。extern修饰变量的声明。举例来说,如果文件a.c需要引用b.c中变量int
v,就可以在a.c中声明externint v,然后就可以引用变量v。这里需要注意的是,被引用的变量v的链接属性必须是外链接(external)的,也就是说a.c要引用到v,不只是取决于在a.c中声明externint v,还取决于变量v本身是能够被引用到的。这涉及到c语言的另外一个话题--变量的作用域。能够被其他模块以extern修饰符引用到的变量通常是全局变量。还有很重要的一点是,externint v可以放在a.c中的任何地方,比如你可以在a.c中的函数fun定义的开头处声明extern int v,然后就可以引用到变量v了,只不过这样只能在函数fun作用域中引用v罢了,这还是变量作用域的问题。对于这一点来说,很多人使用的时候都心存顾虑。好像extern声明只能用于文件作用域似的。
所以被extern "C"修饰的变量和函数是按照C语言方式编译和连接的; 未加extern“C”声明时的编译方式。 首先看看C++中对类似C的函数是怎样编译的。 作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为: void foo( int x, int y ); 该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。
所以我们上面这段代码的作用就是将这两个未定义函数定义成全局可以访问。
这样我们的问题就解决啦。当然还是推荐使用最新的cocos2dx,不要为了旧版本耽误过多时间