cocos2dx项目或者cocos creator开发的项目中,当导出iOS项目以后,正常来讲是没有问题的,可是,当Xcode升级到9.0时,运行Xcode项目会报错,也就是标题的那个从错误,这就有点头疼了,由于报错部分是在CCFileUtils.cpp文件中,这个是cocos生成的文件,咱们通常不会修改这个文件,可是若是真的出了问题,实在是有点头疼。在网上找了一下解决方案,终于在官方的论坛里面找到了,这里把解决方案搬过来,便于你们沟通和交了。
这里是官方论坛的连接地址Call to unavailable function ‘system’: not available on iOS官方已经帮忙给出了解决办法,这里,将官方的办法从新讲解一遍。
对应的是一个GitHub的连接,打开后,是对CCFileUtils.cpp文件的相关修改。这里简单说一下报错缘由。缘由是system命令不可用了,网上查了别的解决办法,有人说把system(command.c_str()); 改成popen(command.c_str(), “r”);可是我试了一下发现后面的命令也是不可用的,可能我操做有问题吧。。。下面继续说官方的办法。官方让咱们对CCFileUtils.cpp文件进行修改,注意,这里不能直接把GitHub上面的这个文件的替换本身项目的该文件,由于2个项目的这个文件实际上是不同的,不一样的地方,不单单是GitHub上面的变化。
首先找到对应的部分,搜索#include <dirent.h>
,而后,在下面添加下面的代码:ios
#if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID) #include <ftw.h> #endif
而后在新添加的代码下面有下面两个方法:git
bool FileUtils::isDirectoryExistInternal(const std::string& dirPath) const
和github
bool FileUtils::createDirectory(const std::string& path)
在这两个方法的下面,添加以下代码:spa
namespace { #if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID) int unlink_cb(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf) { int rv = remove(fpath); if (rv) perror(fpath); return rv; } #endif }
bool FileUtils::removeDirectory(const std::string& path)
在方法的开始部分,添加下面内容:code
#if !defined(CC_TARGET_OS_TVOS) #if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID) if (nftw(path.c_str(), unlink_cb, 64, FTW_DEPTH | FTW_PHYS) == -1) return false; else return true; #else
方法结尾处添加下面内容:开发
#endif // (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID) #endif // !defined(CC_TARGET_OS_TVOS)
至此,就解决了该问题,对于该问题,个人理解是这里调用了系统底层的删除目录的命令,也就是system里面的方法,可是高版本的系统中,应该是屏蔽掉了这个系统命令,不容许调用了,因此,才会出现上面的问题。期待后面版本的cocos引擎或者creator可以修复这个问题。rem