安卓工作室CMake错误:构建命令失败。

18

当我从代码示例(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中出现了多次。

我正在使用64位的Arch-Linux。

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文件? - rpurohit
好的,我已经编辑了帖子。 - Biskit1943
1
你使用的NDK版本是什么?一些版本对clang编译器的支持有限。 - rpurohit
我使用的是15.1.4119093。 - Biskit1943
@rpurohit 我也遇到了同样的问题。你能否帮我解决一下我的问题?https://dev59.com/eKzka4cB1Zd3GeqP94fi。 - Nitish Patel
11个回答

38

使用“生成 -> 刷新已链接的 C++ 项目”命令,解决了我的这个错误。


4
这真是救命之恩。 我也用过它。 我的建议是先尝试这个,然后再尝试其他的东西。 - SnuKies
第一次它没有起作用。但是在将NDK从版本17降级到15,将kotlin 1.2.41降级到1.2.31并点击此选项“Build-> Refresh Linked C ++ Projects”后,它对我有用。 - Shanki Bansal
非常感谢!这真的是救命稻草。在我的Windows 10上运行良好。 - Ciro Mine

18

我在网上找到了这个解决方案并且它起作用了,但是没有解释它是如何起作用的:

从你的build.gradle文件中删除以下代码块:

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

1
显然这个东西似乎工作正常。不确定为什么... - nutella_eater
1
非常感谢 @Mohd Zaid 我已经搜索了两天,现在它可以工作了,但我不知道为什么。 - Muhammad Zeeshan
1
这不是解决方案,该项目将成功运行但无法构建所需的库,就我而言,它是wireguard,因此在去除该部分后,出现以下错误:"dlopen失败:找不到库“libwg-go.so”"。 - Shahzain ali
你的评论救了我的命。不知何故,只有这个起作用了。谢谢你。 - Indranil Dutta

9

@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'
}

12
我的情况是出现了这个错误信息:"Could not get unknown property 'gcc' for object of type com.android.build.gradle.internal.dsl.ExternalNativeCmakeOptions." 我简直无法相信Google犯了这么低级的错误。 - John Perry
你真是个救命恩人! - Tahlil

5

目前我建议您使用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系统中。如果你在其他平台上,请使用位于预构建文件夹下的现有目录。


尝试在CMakeLists.txt的开头运行它。 - rpurohit
那对我没用。 错误仍然存在,所以命令没有起作用 :/ - Biskit1943
@Biskit1943 请问如何从clang更改编译器为GCC?能否详细说明正确的步骤,因为我遇到了相同的错误? - Nitish Patel
@rpurohit 我认为这个答案现在已经过时了。 - user3738870

1

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

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

to

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

它再次起作用了。

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

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

0
我尝试了上面提供的解决方案,但没有成功。然后我改变了CMakeLists.txt文件中设置的OpenCV_DIR路径,结果成功了。我的项目没有指向正确的路径,这导致了错误。请确保在CMakeLists.txt文件中提供了正确的路径。
例如:
set(OpenCV_DIR "...../OpenCV_Android/install/sdk/native/jni/abi-arm64-v8a")

0

当您升级gradle或其他依赖项时,有时会出现此错误。一个简单的解决方案是进行Build > "Refresh linked C++ project"操作,然后重新构建您的项目。一切都会恢复正常。


0
在我的情况下,我已经将我的Android项目升级到API 33,因此我已经将我的NDK库编译的SDK版本与文件->项目结构->模块中的项目编译SDK版本匹配。同时选择了NDK版本,之前未选择,这样就可以工作了。

0

如果之前的答案对您没有用,就像我一样,尝试修复cmake和ndk的bin文件夹中的权限。在我的情况下:C:\android-sdk\ cmake\3.6.4111459 \ bin和c:\android-sdk\ndk-bundle

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


0
去项目结构然后选择你的NDK版本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接