Android 如何从命令行使用cmake为根安卓设备生成可执行文件?

Android 如何从命令行使用cmake为根安卓设备生成可执行文件?,android,c++,linux,cmake,android-ndk,Android,C++,Linux,Cmake,Android Ndk,我想运行一个简单的可执行文件,当我从adb shell执行它时,它应该打印“Hello Cmake”。为此,我用CMAKLISTS.TXT文件创建了一个简单的C++文件: 你好。cpp #include <iostream> int main(int, char**) { std::cout << "Hello, CMake!\n"; } 我已尝试在终端中运行以下命令: cmake D:/Development/CMAKE/HelloCmake/ -G Ni

我想运行一个简单的可执行文件,当我从adb shell执行它时,它应该打印“Hello Cmake”。为此,我用CMAKLISTS.TXT文件创建了一个简单的C++文件: 你好。cpp

#include <iostream>

int main(int, char**) {
    std::cout << "Hello, CMake!\n";
}

我已尝试在终端中运行以下命令:

cmake D:/Development/CMAKE/HelloCmake/ -G Ninja \
-DANDROID_TOOLCHAIN_NAME=aarch64-linux-android29-clang++ \
-DANDROID_PLATFORM=29 \
-DCMAKE_CACHEFILE_DIR=D:/Development/CMAKE/HelloCmake/build \
-DCMAKE_MAKE_PROGRAM=D:/Sdk/cmake/3.10.2.4988404/bin/ninja.exe \
-DCMAKE_C_COMPILER=D:/Sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android29-clang \
-DCMAKE_CXX_COMPILER=D:/Sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android29-clang++
结果如下:

D:\Development\CMAKE\HelloCmake>cmake D:/Development/CMAKE/HelloCmake/ -G Ninja -DANDROID_TOOLCHAIN_NAME=aarch64-linux-android29-clang++ -DANDROID_PLATFORM=29 -DCMAKE_CACHEFILE_DIR=D:/Development/CMAKE/HelloCmake/build -DCMAKE_MAKE_PROGRAM=D:/Sdk/cmake/3.10.2.4988404/bin/ninja.exe -DCMAKE_C_COMPILER=D:/Sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android29-clang -DCMAKE_CXX_COMPILER=D:/Sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android29-clang++
-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
-- Check for working C compiler: D:/Sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android29-clang
-- Check for working C compiler: D:/Sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android29-clang -- broken
CMake Error at D:/Sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake:52 (message):
  The C compiler

    "D:/Sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android29-clang"

  is not able to compile a simple test program.

  It fails with the following output:

    Change Dir: D:/Development/CMAKE/HelloCmake/CMakeFiles/CMakeTmp

    Run Build Command:"D:/Sdk/cmake/3.10.2.4988404/bin/ninja.exe" "cmTC_e4775"
    ninja: fatal: CreateProcess: %1 is not a valid Win32 application.





  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt


-- Configuring incomplete, errors occurred!
See also "D:/Development/CMAKE/HelloCmake/CMakeFiles/CMakeOutput.log".
See also "D:/Development/CMAKE/HelloCmake/CMakeFiles/CMakeError.log".

D:\Development\CMAKE\HelloCmake>
请帮助我正确配置它

更新1 在Michael的指导下,我在Android Studio中找到了
build_command.txt
文件,它为简单的“Hello World”应用程序提供了以下内容:

Executable : D:\Sdk\cmake\3.10.2.4988404\bin\cmake.exe
arguments : 
-HD:\Development\Android\HelloCPP\app\src\main\cpp
-BD:\Development\Android\HelloCPP\app\.cxx\cmake\debug\arm64-v8a
-DANDROID_ABI=arm64-v8a
-DANDROID_PLATFORM=android-26
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=D:\Development\Android\HelloCPP\app\build\intermediates\cmake\debug\obj\arm64-v8a
-DCMAKE_BUILD_TYPE=Debug
-DANDROID_NDK=D:\Sdk\ndk\20.1.5948944
-DCMAKE_CXX_FLAGS=-std=c++14
-DCMAKE_SYSTEM_NAME=Android
-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a
-DCMAKE_SYSTEM_VERSION=26
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON
-DCMAKE_ANDROID_NDK=D:\Sdk\ndk\20.1.5948944
-DCMAKE_TOOLCHAIN_FILE=D:\Sdk\ndk\20.1.5948944\build\cmake\android.toolchain.cmake
-G Ninja
-DCMAKE_MAKE_PROGRAM=D:\Sdk\cmake\3.10.2.4988404\bin\ninja.exe
jvmArgs : 
D:\Sdk\cmake\3.10.2.4988404\bin\cmake.exe 
-HD:\Development\CMAKE\HelloCmake\ 
-BD:\Development\CMAKE\HelloCmake\arm64-v8a 
-DANDROID_ABI=arm64-v8a 
-DANDROID_PLATFORM=android-29 
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=D:\Development\CMAKE\HelloCmake\build 
-DCMAKE_BUILD_TYPE=Debug 
-DANDROID_NDK=D:\Sdk\ndk\20.1.5948944 
-DCMAKE_CXX_FLAGS=-std=c++14 
-DCMAKE_SYSTEM_NAME=Android 
-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a 
-DCMAKE_SYSTEM_VERSION=26 
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON 
-DCMAKE_ANDROID_NDK=D:\Sdk\ndk\20.1.5948944 
-DCMAKE_TOOLCHAIN_FILE=D:\Sdk\ndk\20.1.5948944\build\cmake\android.toolchain.cmake 
-G Ninja 
-DCMAKE_MAKE_PROGRAM=D:\Sdk\cmake\3.10.2.4988404\bin\ninja.exe
我已为我的应用程序运行以下命令:

Executable : D:\Sdk\cmake\3.10.2.4988404\bin\cmake.exe
arguments : 
-HD:\Development\Android\HelloCPP\app\src\main\cpp
-BD:\Development\Android\HelloCPP\app\.cxx\cmake\debug\arm64-v8a
-DANDROID_ABI=arm64-v8a
-DANDROID_PLATFORM=android-26
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=D:\Development\Android\HelloCPP\app\build\intermediates\cmake\debug\obj\arm64-v8a
-DCMAKE_BUILD_TYPE=Debug
-DANDROID_NDK=D:\Sdk\ndk\20.1.5948944
-DCMAKE_CXX_FLAGS=-std=c++14
-DCMAKE_SYSTEM_NAME=Android
-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a
-DCMAKE_SYSTEM_VERSION=26
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON
-DCMAKE_ANDROID_NDK=D:\Sdk\ndk\20.1.5948944
-DCMAKE_TOOLCHAIN_FILE=D:\Sdk\ndk\20.1.5948944\build\cmake\android.toolchain.cmake
-G Ninja
-DCMAKE_MAKE_PROGRAM=D:\Sdk\cmake\3.10.2.4988404\bin\ninja.exe
jvmArgs : 
D:\Sdk\cmake\3.10.2.4988404\bin\cmake.exe 
-HD:\Development\CMAKE\HelloCmake\ 
-BD:\Development\CMAKE\HelloCmake\arm64-v8a 
-DANDROID_ABI=arm64-v8a 
-DANDROID_PLATFORM=android-29 
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=D:\Development\CMAKE\HelloCmake\build 
-DCMAKE_BUILD_TYPE=Debug 
-DANDROID_NDK=D:\Sdk\ndk\20.1.5948944 
-DCMAKE_CXX_FLAGS=-std=c++14 
-DCMAKE_SYSTEM_NAME=Android 
-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a 
-DCMAKE_SYSTEM_VERSION=26 
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON 
-DCMAKE_ANDROID_NDK=D:\Sdk\ndk\20.1.5948944 
-DCMAKE_TOOLCHAIN_FILE=D:\Sdk\ndk\20.1.5948944\build\cmake\android.toolchain.cmake 
-G Ninja 
-DCMAKE_MAKE_PROGRAM=D:\Sdk\cmake\3.10.2.4988404\bin\ninja.exe
我得到以下输出:

D:\Development\CMAKE\HelloCmake>D:\Sdk\cmake\3.10.2.4988404\bin\cmake.exe -HD:\Development\CMAKE\HelloCmake\ -BD:\Development\CMAKE\HelloCmake\arm64-v8a -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-29 -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=D:\Development\CMAKE\HelloCmake\build -DCMAKE_BUILD_TYPE=Debug -DANDROID_NDK=D:\Sdk\ndk\20.1.5948944 -DCMAKE_CXX_FLAGS=-std=c++14 -DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a -DCMAKE_SYSTEM_VERSION=26 -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_ANDROID_NDK=D:\Sdk\ndk\20.1.5948944 -DCMAKE_TOOLCHAIN_FILE=D:\Sdk\ndk\20.1.5948944\build\cmake\android.toolchain.cmake -G Ninja -DCMAKE_MAKE_PROGRAM=D:\Sdk\cmake\3.10.2.4988404\bin\ninja.exe
-- Check for working C compiler: D:/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe
-- Check for working C compiler: D:/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: D:/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe
-- Check for working CXX compiler: D:/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: D:/Development/CMAKE/HelloCmake/arm64-v8a

D:\Development\CMAKE\HelloCmake>
构建文件被写入
arm64-v8a
,但我没有找到任何
ELF共享对象、64位LSB arm64、动态(/system/bin/linker64)、剥离的
对象,这些对象应该能够在我的android设备上运行

我只找到了以下文件:

$ find . | xargs file | grep ELF
./CMakeFiles/3.10.2/CMakeDetermineCompilerABI_C.bin:   ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /system/bin/linker64, BuildID[sha1]=7cb1fddcd4776716628feaf37d471c1ea4a55314, with debug_info, not stripped
./CMakeFiles/3.10.2/CMakeDetermineCompilerABI_CXX.bin: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /system/bin/linker64, BuildID[sha1]=1f498297f62e5a52751312894e88a9abef0412d5, with debug_info, not stripped
./CMakeFiles/feature_tests.bin:                        ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /system/bin/linker64, BuildID[sha1]=a56baeb98e3f077c3cc0a512b0535089a717929c, with debug_info, not stripped
有什么建议吗

更新2 我已经运行了
D:\Sdk\cmake\3.10.2.4988404\bin\ninja.exe-C arm64-v8a
命令来创建目标静态库,但是我得到了
libhello\u cmake.a
,它是
当前ar存档


我认为要制作一个可执行文件,
CMakeLists.txt
add\u library
行应该替换为其他行?

有几个问题:

  • 静态库不能直接运行。如果要构建可运行的可执行文件,应使用
    add\u executable
    而不是
    add\u library

  • 调用
    cmake
    时,应设置
    cmake_工具链_文件
    选项,以指定要使用的工具链文件,以及可能的其他选项。为了了解Android Studio/Gealle使用的概念,可以使用Android Studio的项目向导来创建一个带有C++支持的Android项目,并查看在构建该项目时生成的CMAJUBIGUDID.COMPRATIONTXT 文件。
  • 运行
    cmake
    后,您还需要运行
    ninja
    。该命令类似于
    ninja-C


  • 有几个问题:

  • 静态库不能直接运行。如果要构建可运行的可执行文件,应使用
    add\u executable
    而不是
    add\u library

  • 调用
    cmake
    时,应设置
    cmake_工具链_文件
    选项,以指定要使用的工具链文件,以及可能的其他选项。为了了解Android Studio/Gealle使用的概念,可以使用Android Studio的项目向导来创建一个带有C++支持的Android项目,并查看在构建该项目时生成的CMAJUBIGUDID.COMPRATIONTXT 文件。
  • 运行
    cmake
    后,您还需要运行
    ninja
    。该命令类似于
    ninja-C


  • 我想运行一个简单的静态库,当我从adb shell执行它时,它应该打印“Hello Cmake”您不运行静态库。在构建共享库或可执行文件时,可以针对它们进行链接。无论如何,在运行cmake时,您似乎没有指定工具链文件。我建议您在Android工作室中创建一个包含C++代码的简单项目,并查看生成的cMajyBuudLeCudith.txt文件。@米迦勒,请在更新文件1:在生成生成文件之后建议您运行NIJA来实际构建程序。类似于
    ninja-C
    (其中
    是包含生成的构建文件的目录)。但正如我之前所说的,静态库不是用来直接执行的。你可能想要
    add_executable
    而不是
    add_library
    (还要注意,你可能需要一个根设备才能运行你的可执行文件)。我是cmake的新手,我需要一个可以在根设备上执行的静态库。那么,我还需要为此添加可执行文件吗?如果构建一个静态库,就会得到这样的结果。正如我所说,如果您想要构建一个可执行文件,请使用
    add\u executable
    “我想要运行一个简单的静态库,当我从adb shell执行它时,它应该打印“Hello Cmake”您不运行静态库。在构建共享库或可执行文件时,可以针对它们进行链接。无论如何,在运行cmake时,您似乎没有指定工具链文件。我建议您在Android工作室中创建一个包含C++代码的简单项目,并查看生成的cMajyBuudLeCudith.txt文件。@米迦勒,请在更新文件1:在生成生成文件之后建议您运行NIJA来实际构建程序。类似于
    ninja-C
    (其中
    是包含生成的构建文件的目录)。但正如我之前所说的,静态库不是用来直接执行的。你可能想要
    add_executable
    而不是
    add_library
    (还要注意,你可能需要一个根设备才能运行你的可执行文件)。我是cmake的新手,我需要一个可以在根设备上执行的静态库。那么,我还需要为此添加可执行文件吗?如果构建一个静态库,就会得到这样的结果。正如我所说,如果您想构建一个可执行文件,请使用
    add\u executable