【问题标题】:Could not find method cppFlags() arguments() for arguments找不到参数的方法 cppFlags() arguments()
【发布时间】:2018-05-02 09:12:36
【问题描述】:

我正在尝试使用

std::function

但是编译器会报错

Error:(50, 10) error: no type named 'function' in namespace 'std'

我已尝试修改 build.gradle 文件

externalNativeBuild {
    ndkBuild {
        path "src/main/jni/Android.mk"
    }
    cmake {
        cppFlags "-std=c++11"
        arguments "-DANDROID_STL=gnustl_static"
        path 'src/main/jni/CMakeLists.txt'
    }
}

但它不接受path以外的参数并抛出以下错误

Error:(28, 0) Could not find method arguments() for arguments [-DANDROID_STL=gnustl_static] on object of type com.android.build.gradle.internal.dsl.CmakeOptions.

请帮助我能够使用

std::function

更新

感谢 @Alex Cohn 我能够配置标志和参数,现在我的文件看起来像这样

apply plugin: 'com.android.library'

android {
    compileSdkVersion 25
    buildToolsVersion '26.0.2'

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11"
                arguments "-DANDROID_STL=gnustl_static"
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        /*   ndkBuild {
               path "src/main/jni/Android.mk"
           }*/
        cmake {
            // cppFlags "-std=c++11"
            //arguments "-DANDROID_STL=gnustl_static"
            path 'src/main/jni/CMakeLists.txt'
        }
    }
}

dependencies {
    compile 'com.android.support:support-annotations:25.0.1'
}

【问题讨论】:

  • 你的 cpp 源中有 #include <functional> 吗?
  • 您可以进一步将-DCMAKE_CXX_STANDARD=11 添加到您的参数设置中。
  • @vre,是的,我试过了,添加参数不起作用,它根本不接受任何参数,我可以在 CMAke 文件本身中设置这个参数吗?
  • 顺便说一句。在参数行的末尾有一个多余的逗号。我想这会阻止其他选项被识别。逗号仅用于分隔不同的参数。
  • @vre,你说得对,但这只是一个错字,我在插入代码时不小心输入了它

标签: android c++ cmake android-ndk ndk-build


【解决方案1】:

build.gradle 中有两个完全不同的块,名为 externalNativeBuild(感谢 Google)。

Oneandroid 顶级块下,它指定了原生构建脚本的路径,cmakendkBuild(但不是两者都有)。

other 可用于从 gradle 指定本机构建的一些参数。此块通常是 defaultConfig 块的子块,但也可以为 flavors 出现(参见 example)。

这些 externalNativeBuild 块也可以有 cmakendkBuild 子级,但只有与 path 匹配的子级设置(见上文)是相关的,另一个被忽略。

最后,将你的块分成两部分,并将每一块放在 build.gradle 层次结构中的正确位置。

【讨论】:

  • 非常有价值的信息!!谢谢我现在会尝试解决问题,至少我现在可以设置标志了。
  • 如果没有你的回答我真不知道该怎么办!!有用 !!现在它可以工作了!我想知道我在哪里可以找到您提供的信息?我已多次阅读所有官方文档!谢谢,谷歌
  • 悲伤的安卓噪音
猜你喜欢
  • 2017-01-23
  • 2017-03-22
  • 2018-05-24
  • 2021-11-08
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
  • 2017-10-18
相关资源
最近更新 更多