如何从命令行使用 cmake 为有根的安卓设备制作可执行文件?
How to use cmake from command line to make an executable for rooted Android device?
我想运行一个简单的可执行文件,当我从adb shell执行它时,它应该打印"Hello Cmake"。为此,我创建了一个带有CMakeLists.txt文件的简单c ++文件,如下所示:
你好.cpp
#include <iostream>
int main(int, char**) {
std::cout << "Hello, CMake!n";
}
CMakeList.txt
cmake_minimum_required(VERSION 3.4.1)
add_library( # Sets the name of the library.
hello_cmake
# Sets the library as a static library.
STATIC
# Provides a relative path to your source file(s).
hello.cpp )
我尝试在终端中运行以下命令:
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:DevelopmentCMAKEHelloCmake>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:DevelopmentCMAKEHelloCmake>
请帮助我正确配置它。
更新 1在迈克尔的指导下,我在Android Studio中找到了build_command.txt
文件,其中包含以下内容,用于简单的"Hello World"应用程序:
Executable : D:Sdkcmake3.10.2.4988404bincmake.exe
arguments :
-HD:DevelopmentAndroidHelloCPPappsrcmaincpp
-BD:DevelopmentAndroidHelloCPPapp.cxxcmakedebugarm64-v8a
-DANDROID_ABI=arm64-v8a
-DANDROID_PLATFORM=android-26
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=D:DevelopmentAndroidHelloCPPappbuildintermediatescmakedebugobjarm64-v8a
-DCMAKE_BUILD_TYPE=Debug
-DANDROID_NDK=D:Sdkndk20.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:Sdkndk20.1.5948944
-DCMAKE_TOOLCHAIN_FILE=D:Sdkndk20.1.5948944buildcmakeandroid.toolchain.cmake
-G Ninja
-DCMAKE_MAKE_PROGRAM=D:Sdkcmake3.10.2.4988404binninja.exe
jvmArgs :
我已经为我的应用程序运行了以下命令:
D:Sdkcmake3.10.2.4988404bincmake.exe
-HD:DevelopmentCMAKEHelloCmake
-BD:DevelopmentCMAKEHelloCmakearm64-v8a
-DANDROID_ABI=arm64-v8a
-DANDROID_PLATFORM=android-29
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=D:DevelopmentCMAKEHelloCmakebuild
-DCMAKE_BUILD_TYPE=Debug
-DANDROID_NDK=D:Sdkndk20.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:Sdkndk20.1.5948944
-DCMAKE_TOOLCHAIN_FILE=D:Sdkndk20.1.5948944buildcmakeandroid.toolchain.cmake
-G Ninja
-DCMAKE_MAKE_PROGRAM=D:Sdkcmake3.10.2.4988404binninja.exe
我得到以下输出:
D:DevelopmentCMAKEHelloCmake>D:Sdkcmake3.10.2.4988404bincmake.exe -HD:DevelopmentCMAKEHelloCmake -BD:DevelopmentCMAKEHelloCmakearm64-v8a -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-29 -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=D:DevelopmentCMAKEHelloCmakebuild -DCMAKE_BUILD_TYPE=Debug -DANDROID_NDK=D:Sdkndk20.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:Sdkndk20.1.5948944 -DCMAKE_TOOLCHAIN_FILE=D:Sdkndk20.1.5948944buildcmakeandroid.toolchain.cmake -G Ninja -DCMAKE_MAKE_PROGRAM=D:Sdkcmake3.10.2.4988404binninja.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:DevelopmentCMAKEHelloCmake>
构建文件已写入arm64-v8a
但我没有找到任何应该能够在我的 android 设备上运行ELF shared object, 64-bit LSB arm64, dynamic (/system/bin/linker64), stripped
对象。
我只找到了以下文件:
$ 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:Sdkcmake3.10.2.4988404binninja.exe -C arm64-v8a
命令来制作目标静态库,但我得到了libhello_cmake.a
这是current ar archive
.
我认为要制作可执行文件,CMakeLists.txt
add_library
行应该用其他东西替换吗?
有几个问题:
-
静态库不应直接运行。如果要构建可以运行的可执行文件,则应使用
add_executable
而不是add_library
。 -
调用
cmake
时,应设置CMAKE_TOOLCHAIN_FILE
选项以指定要使用的工具链文件,并可能设置其他选项。要了解Android Studio/Gradle使用什么,您可以使用Android Studio的项目向导创建一个支持C++的Android项目,并查看构建该项目时生成的cmake_build_command.txt
文件。 -
运行
cmake
后,您还需要运行ninja
。该命令类似于ninja -C <directory containing build files generated by cmake>
.
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 是否可以在命令行中将输入参数传递给可执行文件
- 如何从命令行使用 cmake 为有根的安卓设备制作可执行文件?
- 提供变量作为 MATLAB 系统命令的输入参数,以便C++可执行文件
- 从命令提示符使用 MSBuild 调试简单的C++可执行文件
- 使命令不产生可执行文件
- 如何从命令行运行可执行文件时启用系统错误消息
- 为什么文件命令声明可执行文件包含"debug_info"
- 使用 php 将带有命令行可执行文件路径的参数传递
- 通过Linux命令行执行时,可执行文件运行正常 - 调用C System()命令时运行时错误
- 使用系统命令调用可执行文件
- 是否可以使用C++中的一个make命令,用两个不同的gcc版本编译两个不同可执行文件
- 用于查找可执行文件依赖项的命令
- 输入/输出从命令行可执行文件重定向到文件
- 如何在C++中调用预编译可执行文件中的函数(通过命令调用)
- 如何移动到文件夹并执行Windows命令行调用
- c++可执行文件打开命令窗口
- 我如何运行GDB,在命令行中输入文本并查看可执行文件如何处理这些条目
- Xcode 4中的命令行工具构建版本,在构建可执行文件中包含图像存在问题
- 更改可执行文件的图标,而无需重新编译或重新链接,并使用 Microsoft SDK 中的命令行工具