1. ホーム
  2. android

cmakeを使用しているアンドロイドスタジオはc++をサポートし、問題は、cmakeのエラーを同期することはできません。

2022-02-18 13:25:32
<パス

質問

エラーメッセージ

External Native Build Issues
Build command failed.
Error while executing '/root/Android/Sdk/cmake/3.6.3155560/bin/cmake' with arguments { -H/AndroidStudioProjects/AccessQRat/app -B/ root/AndroidStudioProjects/AccessQRat/app/.externalNativeBuild/cmake/debug/x86_64 -GAndroid Gradle - Ninja -DANDROID_ABI=x86_64 - DANDROID_NDK=/root/Android/Sdk/ndk-bundle -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/root/AndroidStudioProjects/AccessQRat/app/. externalNativeBuild/cmake/debug/obj/x86_64 -DCMAKE_BUILD_TYPE=Debug -DCMAKE_MAKE_PROGRAM=/root/Android/Sdk/cmake/3.6.3155560/bin/ ninja -DCMAKE_TOOLCHAIN_FILE=/root/Android/Sdk/cmake/3.6.3155560/android.toolchain.cmake -DANDROID_NATIVE_API_LEVEL=21 -DCMAKE_CXX_ FLAGS=-std=c++11 -frtti -fexceptions}
-- Check for working C compiler: /root/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
-- Check for working C compiler: /root/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -- broken
-- Configuring incomplete, errors occurred!
See also "/root/AndroidStudioProjects/AccessQRat/app/.externalNativeBuild/cmake/debug/x86_64/CMakeFiles/CMakeOutput.log".
See also "/root/AndroidStudioProjects/AccessQRat/app/.externalNativeBuild/cmake/debug/x86_64/CMakeFiles/CMakeError.log".
CMake Error at /root/Android/Sdk/cmake/3.6.3155560/share/cmake-3.6/Modules/CMakeTestCCompiler.cmake:61 (message):
  The C compiler
  "/root/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: /root/AndroidStudioProjects/AccessQRat/app/.externalNativeBuild/cmake/debug/x86_64/CMakeFiles/CMakeTmp
  Run Build Command:"/root/Android/Sdk/cmake/3.6.3155560/bin/ninja"
  "cmTC_a0fde"
  [1/2] Building C object CMakeFiles/cmTC_a0fde.dir/testCCompiler.c.o
  [2/2] Linking C executable cmTC_a0fde
  FAILED: : &&
  /root/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
  -target x86_64-none-linux-android -gcc-toolchain
  /root/Android/Sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64
  --sysroot=/root/Android/Sdk/ndk-bundle/platforms/android-21/arch-x86_64 -g
  -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong
  -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security
  -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings
  -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro
  -Wl,-z,now -Wl,--gc-sections -Wl,-z,nocopyreloc -pie -fPIE
  CMakeFiles/cmTC_a0fde.dir/testCCompiler.c.o -o cmTC_a0fde -lm && :
  /root/Android/Sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64/lib/gcc/x86_64-linux-android/4.9.x/. /... /... /... /x86_64-linux-android/bin/ld:
Error:
  /root/Android/Sdk/ndk-bundle/platforms/android-21/arch-x86_64/usr/lib/... /lib64/crtbegin_dynamic.o:
  file is empty
  /root/Android/Sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64/lib/gcc/x86_64-linux-android/4.9.x/... /... /... /... /x86_64-linux-android/bin/ld:
Error:
  /root/Android/Sdk/ndk-bundle/platforms/android-21/arch-x86_64/usr/lib/... /lib64/crtend_android.o:
  file is empty
  /root/Android/Sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64/lib/gcc/x86_64-linux-android/4.9.x/... /... /... /... /x86_64-linux-android/bin/ld:
Error:
  /root/Android/Sdk/ndk-bundle/platforms/android-21/arch-x86_64/usr/lib/... /lib64/libm.so:
  file is empty
  /root/Android/Sdk/ndk
Error:
  /root/Android/Sdk/ndk-bundle/platforms/android-21/arch-x86_64/usr/lib/... /lib64/libdl.so:
  file is empty
Error:error: linker command failed with exit code 1 (use -v to see
  invocation)
  ninja: build stopped: subcommand failed.
  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt
Error:executing external native build for cmake /root/AndroidStudioProjects/AccessQRat/app/CMakeLists.txt
Build command failed.
Error while executing '/root/Android/Sdk/cmake/3.6.3155560/bin/cmake' with arguments {-H/AndroidStudioProjects/AccessQRat/app -B/ root/AndroidStudioProjects/AccessQRat/app/.externalNativeBuild/cmake/release/x86_64 -GAndroid Gradle - Ninja -DANDROID_ABI=x86_64 - DANDROID_NDK=/root/Android/Sdk/ndk-bundle -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/root/AndroidStudioProjects/AccessQRat/app/. externalNativeBuild/cmake/release/obj/x86_64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_MAKE_PROGRAM=/root/Android/Sdk/cmake/3.6.3155560/bin /ninja -DCMAKE_TOOLCHAIN_FILE=/root/Android/Sdk/cmake/3.6.3155560/android.toolchain.cmake -DANDROID_NATIVE_API_LEVEL=21 -DCMAKE_CXX_ FLAGS=-std=c++11 -frtti -fexceptions}
-- Check for working C compiler: /root/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
-- Check for working C compiler: /root/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -- broken
-- Configuring incomplete, errors occurred!
See also "/root/AndroidStudioProjects/AccessQRat/app/.externalNativeBuild/cmake/release/x86_64/CMakeFiles/CMakeOutput.log" .
See also "/root/AndroidStudioProjects/AccessQRat/app/.externalNativeBuild/cmake/release/x86_64/CMakeFiles/CMakeError.log".
CMake Error at /root/Android/Sdk/cmake/3.6.3155560/share/cmake-3.6/Modules/CMakeTestCCompiler.cmake:61 (message):
  The C compiler
  "/root/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: /root/AndroidStudioProjects/AccessQRat/app/.externalNativeBuild/cmake/release/x86_64/CMakeFiles/CMakeTmp
  Run Build Command:"/root/Android/Sdk/cmake/3.6.3155560/bin/ninja"
  "cmTC_f8bcf"
  [1/2] Building C object CMakeFiles/cmTC_f8bcf.dir/testCCompiler.c.o
  [2/2] Linking C executable cmTC_f8bcf
  FAILED: : &&
  /root/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
  -target x86_64-none-linux-android -gcc-toolchain
  /root/Android/Sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64
  --sysroot=/root/Android/Sdk/ndk-bundle/platforms/android-21/arch-x86_64 -g
  -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong
  -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security
  -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings
  -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro
  -Wl,-z,now -Wl,--gc-sections -Wl,-z,nocopyreloc -pie -fPIE
  CMakeFiles/cmTC_f8bcf.dir/testCCompiler.c.o -o cmTC_f8bcf -lm && :
  /root/Android/Sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64/lib/gcc/x86_64-linux-android/4.9.x/. /... /... /... /x86_64-linux-android/bin/ld:
Error:
  /root/Android/Sdk/ndk-bundle/platforms/android-21/arch-x86_64/usr/lib/... /lib64/crtbegin_dynamic.o:
  file is empty
  /root/Android/Sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64/lib/gcc/x86_64-linux-android/4.9.x/... /... /... /... /x86_64-linux-android/bin/ld:
Error:
  /root/Android/Sdk/ndk-bundle/platforms/android-21/arch-x86_64/usr/lib/... /lib

そのため、android studioは同期できません。
(ここでAccessQRatは作成されたプロジェクト名です。)

問題の原因

私のndkフォルダandroid-21は満杯ではありませんが、android-24フォルダは満杯です、しかしcmakeはデフォルトで21を選択します、なぜ21を選択するのか分かりませんが

解決方法

最初にどのNDKのバージョンが完全であるかを確認し、NDK-build/platformsフォルダを見つけ、xxの後のandroid-xxは、番号を表し、つまり、プラットホームのバージョン、私のヒントここによると、明らかにNDKの私のバージョン21はファイルに問題がある、だから私は、バージョンを変更することを選択した私は私のバージョン24がいっぱいですことがわかったので、あなたはこれらのファイルは完全かつ有効であるかどうかを確認するreadelfコマンドを使用することができます。
ndk-buildの下にあるcmakeを検索し

cd ~/Sdk/cmake/3.6.3155560/
# Use vim to edit, you can also use other editors
vim android.toolchain.cmake

PLATFORMとPLATFORM_LEVELに関する記述を探しなさい。

if(ANDROID_PLATFORM MATCHES "^android-([0-8]|10|11)$")
    set(ANDROID_PLATFORM android-9)
elseif(ANDROID_PLATFORM STREQUAL android-20)
    set(ANDROID_PLATFORM android-19)
elseif(NOT ANDROID_PLATFORM)
    set(ANDROID_PLATFORM android-9)
endif()
string(REPLACE "android-" "" ANDROID_PLATFORM_LEVEL ${ANDROID_PLATFORM})
if(ANDROID_ABI MATCHES "64(-v8a)? $" ANDANDROID_PLATFORM_LEVEL LESS 21)
    set(ANDROID_PLATFORM android-21)
    set(ANDROID_PLATFORM_LEVEL 21)
endif()
if(NOT ANDROID_STL)
    set(ANDROID_STL gnustl_static)
endif()

ここで、setによってバージョンが設定されていることが推測できます。そこで、最終的に、自動決定させないようにして、強制的に24にするだけ、つまり、この段落の後に2つのset文を追加することにしました。

if(ANDROID_PLATFORM MATCHES "^android-([0-8]|10|11)$")
    set(ANDROID_PLATFORM android-9)
elseif(ANDROID_PLATFORM STREQUAL android-20)
    set(ANDROID_PLATFORM android-19)
elseif(NOT ANDROID_PLATFORM)
    set(ANDROID_PLATFORM android-9)
endif()
set(ANDROID_PLATFORM android-24)
set(ANDROID_PLATFORM_LEVEL 24)
string(REPLACE "android-" "" ANDROID_PLATFORM_LEVEL ${ANDROID_PLATFORM})
if(ANDROID_ABI MATCHES "64(-v8a)? $" ANDANDROID_PLATFORM_LEVEL LESS 21)
    set(ANDROID_PLATFORM android-21)
    set(ANDROID_PLATFORM_LEVEL 21)
endif()
if(NOT ANDROID_STL)
    set(ANDROID_STL gnustl_static)
endif()

アンドロイドスタジオに戻り、一度再同期すればOKです。