Android Studio CMake 错误:构建命令失败

Posted

技术标签:

【中文标题】Android Studio CMake 错误:构建命令失败【英文标题】:Android Studio CMake Error: Build Command failed 【发布时间】:2017-12-26 09:45:58 【问题描述】:

当我从代码示例 (Hello JIN) 在 android Studio 中打开一个新项目时遇到错误。项目打开后如下:

Build command failed.
Error while executing process /opt/android-sdk/cmake/3.6.4111459/bin/cmake with arguments -H/home/max/Documents/AndroidStudioProjects/HelloJNI1/app/src/main/cpp -B/home/max/Documents/AndroidStudioProjects/HelloJNI1/app/.externalNativeBuild/cmake/arm8Release/arm64-v8a -GAndroid Gradle - Ninja -DANDROID_ABI=arm64-v8a -DANDROID_NDK=/opt/android-sdk/ndk-bundle -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/home/max/Documents/AndroidStudioProjects/HelloJNI1/app/build/intermediates/cmake/arm8/release/obj/arm64-v8a -DCMAKE_BUILD_TYPE=Release -DCMAKE_MAKE_PROGRAM=/opt/android-sdk/cmake/3.6.4111459/bin/ninja -DCMAKE_TOOLCHAIN_FILE=/opt/android-sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-23 -DANDROID_TOOLCHAIN=clang
-- Check for working C compiler: /opt/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
-- Check for working C compiler: /opt/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -- broken
-- Configuring incomplete, errors occurred!
See also "/home/max/Documents/AndroidStudioProjects/HelloJNI1/app/.externalNativeBuild/cmake/arm8Release/arm64-v8a/CMakeFiles/CMakeOutput.log".
See also "/home/max/Documents/AndroidStudioProjects/HelloJNI1/app/.externalNativeBuild/cmake/arm8Release/arm64-v8a/CMakeFiles/CMakeError.log".
CMake Error at /opt/android-sdk/cmake/3.6.4111459/share/cmake-3.6/Modules/CMakeTestCCompiler.cmake:61 (message):
  The C compiler
  "/opt/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang"
  is not able to compile a simple test program.
  It fails with the following output:
   Change Dir: /home/max/Documents/AndroidStudioProjects/HelloJNI1/app/.externalNativeBuild/cmake/arm8Release/arm64-v8a/CMakeFiles/CMakeTmp
  Run Build Command:"/opt/android-sdk/cmake/3.6.4111459/bin/ninja"
  "cmTC_0053d"
  [1/2] Building C object CMakeFiles/cmTC_0053d.dir/testCCompiler.c.o
  FAILED:
  /opt/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
  --target=aarch64-none-linux-android
  --gcc-toolchain=/opt/android-sdk/ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64
  --sysroot=/opt/android-sdk/ndk-bundle/sysroot -isystem
  /opt/android-sdk/ndk-bundle/sysroot/usr/include/aarch64-linux-android
  -D__ANDROID_API__=23 -g -DANDROID -ffunction-sections -funwind-tables
  -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat
  -Werror=format-security -fPIE -o
  CMakeFiles/cmTC_0053d.dir/testCCompiler.c.o -c
  /home/max/Documents/AndroidStudioProjects/HelloJNI1/app/.externalNativeBuild/cmake/arm8Release/arm64-v8a/CMakeFiles/CMakeTmp/testCCompiler.c
  /opt/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang:
  error while loading shared libraries: libncurses.so.5: cannot open shared
  object file: No such file or directory
  ninja: build stopped: subcommand failed.
  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt

此错误在 IDE 中多次丢弃

我使用的是 Arch-Linux 64x

Cmake.txt:

    cmake_minimum_required(VERSION 3.4.1)

add_library(hello-jni SHARED
            hello-jni.c)

# Include libraries needed for hello-jni lib
target_link_libraries(hello-jni
                      android
                      log)

【问题讨论】:

我也遇到了同样的问题,能否请您发布您的 CMakeLists.txt? 好的,我编辑了帖子 您使用的是哪个版本的 NDK?某些版本对 clang 编译器的支持有限。 我用的是 15.1.4119093 @rpurohit 我面临同样的问题。你能帮我解决我的问题吗?***.com/questions/51100111/…. 【参考方案1】:

Build -> Refresh Linked C++ Projects 为我解决了这个错误。

【讨论】:

这是救命稻草。它也对我有用。我的建议是先尝试这个,然后再尝试其他方法。 第一次没用。但是在将 NDK 从版本 17 降级到 15 之后,将 kotlin 1.2.41 降级到 1.2.31 并单击此选项“Build -> Refresh Linked C++ Projects”对我有用。 非常感谢!是真正的救命稻草。在 Windows 10 中为我工作。 新建项目后此选项灰显。【参考方案2】:

我在网上找到了这个解决方案并且它有效,但是没有解释它是如何工作的: 从 build.gradle 文件中删除以下代码块:

externalNativeBuild 
    cmake 
        path "src/main/cpp/CMakeLists.txt"
    

【讨论】:

显然这件事似乎工作正常。不知道为什么...【参考方案3】:

@rpurohit 几乎是正确的,Clang 无法正常工作。但是要更改编译器,您需要更改 build.gradle,在我的 build.gradle 中是第 12 行:

apply plugin: 'com.android.application'

1 android 
2    compileSdkVersion 25
3    buildToolsVersion '25.0.2'
4    defaultConfig 
5       applicationId 'com.example.hellojni'
6       minSdkVersion 23
7       targetSdkVersion 25
8       versionCode 1
9       versionName "1.0"
10      externalNativeBuild 
11          cmake 
12              arguments '-DANDROID_TOOLCHAIN=clang' --> gcc
            
        
    
    buildTypes 
        release 
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        
    
    externalNativeBuild 
        cmake 
            path "src/main/cpp/CMakeLists.txt"
        
    
    productFlavors 
        arm7 
            // in the future, ndk.abiFilter might also work
            ndk 
                abiFilter 'armeabi-v7a'
            
        
        arm8 
            ndk 
                abiFilters 'arm64-v8a'
            
        
        arm 
            ndk 
                abiFilter 'armeabi'
            
        
        x86 
            ndk 
                abiFilter 'x86'
            
        
        x86_64 
            ndk 
                abiFilter 'x86_64'
            
        
        mips 
            ndk 
                abiFilters 'mips', 'mips64'
            
        
        universal 
            ndk 
                abiFilters 'mips', 'mips64', 'x86', 'x86_64'
            
        
    


dependencies 
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:25.2.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.1'

【讨论】:

在我的情况下,“无法为 com.android.build.gradle.internal.dsl.ExternalNativeCmakeOptions 类型的对象获取未知属性 'gcc'。”我无法相信 Google 得到了如此糟糕的结果。 你是救生员!【参考方案4】:

我建议暂时使用 GCC 而不是 clang,因为 clang 仍然不包含所有功能。您可以通过执行以下操作来更改编译器:

set(CMAKE_C_COMPILER /path-to-ndk/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-gcc)

但是,darwin-x86_64 目录仅在您使用 Mac 时才存在。如果您在另一个平台上,只需使用 prebuilt 文件夹下的目录即可。

【讨论】:

尝试在 CMakeLists.txt 的开头运行它。 这对我不起作用错误仍然相同,因此命令不起作用:/ @Biskit1943 如何将编译器从 clang 更改为 GCC?你能解释一下正确的步骤,因为我面临同样的错误吗? @rpurohit 我认为这个答案现在已经过时了【参考方案5】:

我遇到这个问题是因为我设置了native-lib.cpp的错误路径。改变后

add_library(native-lib SHARED native-lib.cpp)

add_library(native-lib SHARED src/main/jni/native-lib.cpp)

又成功了。

顺便说一下,这是我项目结构的一部分。

CMakeLists.txt
src
 |__main
      |___jni
           |___native-lib.cpp

【讨论】:

【参考方案6】:

如果以前的答案对您不起作用,就像我遇到的那样,请尝试修复 cmake 的 bin 文件夹和 ndk 中的权限。在我的情况下: C:\android-sdk\cmake\3.6.4111459\bin 和 c:\android-sdk\ndk-bundle

在我的情况下,用户组确实没有权限,因此 Android Studio 无法运行 cmake。确保它具有读取和执行权限。

【讨论】:

【参考方案7】:

升级 gradle 或其他依赖项时有时会出现此错误。 一个简单的解决方案是构建>“刷新链接的 C++ 项目”,然后重建您的项目。一切顺利

【讨论】:

【参考方案8】:

我尝试了上面提供的解决方案,但没有运气。然后我更改了在 CMakeLists.txt 文件中设置的 OpenCV_DIR 的路径并且它起作用了。我的项目没有指向正确的路径,这导致了错误。确保您在 CMakeLists.txt 文件中提供了正确的路径。

例如:

set(OpenCV_DIR "...../OpenCV_Android/install/sdk/native/jni/abi-arm64-v8a")

【讨论】:

【参考方案9】:

我发现这种方法可行:

下面不需要删除:

    externalNativeBuild 
        cmake 
            path "CMakeLists.txt"
        
    

这很有用。而且你的项目只是少了 ninja 文件。

你可以按照这种方式构建成功!

结果如下:

Make was unable to find a build program corresponding to "Ninja". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.

你应该安装忍者

    在这里下载忍者ninja download file 获取忍者文件 将ninja文件复制到/usrlocal/bin 再次构建。项目运行成功!!

【讨论】:

你能解释一下这是如何解决上述问题的吗?

以上是关于Android Studio CMake 错误:构建命令失败的主要内容,如果未能解决你的问题,请参考以下文章

调试不适用于 Android Studio 的 C++/本机库模块(使用 Cmake)

我们如何将CMake或ndk-build集成到Android Studio 3.0.1中? Gradle版本是4.1,android插件版本3.0.1

Android Studio手动配置Makefile、CMake

C++学习(四四零)android studio如何关联cmake

android studio 2.2.2 32位怎么配置ndk cmake环境

Android Studio cmake突然没有语法高亮