Cocos2d-x 4.x在Android Studio启用C++17无效编译报错如何解决
Cocos2d-x Android构建C++14/17特性代码报错修复
问题复现场景
通过Cocos命令行创建基础C++项目:
cocos new -l cpp -p com.testgame1 -d path_to_dir testgame1
初始空项目Android端可正常完成构建,后续编写使用C14、C17标准特性的代码后(以main.cpp中使用C14支持的泛型lambda为例,代码如下),按照纯原生Android项目的配置方式在模块build.gradle中添加C17编译参数,配置未生效,触发编译错误。
示例问题代码:
void cocos_android_app_init(JNIEnv* env) { LOGD("cocos_android_app_init"); std::string vec; std::transform(std::begin(vec), std::end(vec), std::begin(vec), [](auto& elem) { return elem; } ); appDelegate.reset(new AppDelegate()); }
未生效的build.gradle配置:
defaultConfig { applicationId "com.testgame1" minSdkVersion PROP_MIN_SDK_VERSION targetSdkVersion PROP_TARGET_SDK_VERSION versionCode 1 versionName "1.0" externalNativeBuild { cmake { targets 'MyGame' cppFlags "-std=c++17 -frtti -fexceptions -fsigned-char" arguments "-DCMAKE_FIND_ROOT_PATH=", "-DANDROID_STL=c++_static", "-DANDROID_TOOLCHAIN=clang", "-DANDROID_ARM_NEON=TRUE" } } ndk { abiFilters = [] abiFilters.addAll(PROP_APP_ABI.split(':').collect{it as String}) } }
触发的编译错误:
..\..\..\..\jni\hellocpp\main.cpp:42:72: error: 'auto' not allowed in lambda parameter
当前环境:NDK版本21.4.7075529,相同C++17配置在未集成Cocos2d-x的纯原生Android项目中可正常工作。
问题根因
Cocos2d-x引擎自带的CMake构建脚本会强制指定全局C编译标准为C11,在Gradle中配置的cppFlags会被引擎的CMake配置覆盖,实际编译时未启用C14/17标准支持,因此C14新增的泛型lambda(lambda参数使用auto)特性会被编译器判定为语法错误。
修复步骤
选择以下任意一种方案即可:
- 方案1:修改项目级CMake配置(推荐,不改动引擎源码)
打开项目根目录下的CMakeLists.txt文件,在引用引擎子模块的代码之前,添加C++标准强制配置:# 配置要使用的C++标准,需要C++14就填14,需要C++17就填17 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # 注意:上述配置必须写在add_subdirectory(cocos2d)这行代码之前 add_subdirectory(cocos2d) - 方案2:直接修改引擎内置的C++标准配置
找到引擎目录下的cocos/CMakeLists.txt文件,搜索文件内所有-std=c++11的编译flag,替换为-std=c++17,同时将文件中CMAKE_CXX_STANDARD的赋值从11修改为17即可。
配置修改完成后,需要清理旧的构建缓存:删除项目下的.externalNativeBuild、build目录,在Android Studio中执行Clean Project后重新构建,即可正常编译包含C++14/17特性的代码。
内容的提问来源于stack exchange,提问作者Range
相关产品推荐
相关产品推荐

