我使用Gradle和CMake从命令行编译Android NDK项目。以前,我使用Ant和ndk-build
,但我试图将项目完全迁移到Gradle和CMake。
在我的build.gradle
中,我有以下几行来调用CMake:
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
}
}
现在如何强制CMake在创建之前将所有编译器调用打印到控制台?具体来说,我想看看CMake如何运行编译器和链接器。
我已经尝试了以下内容,但都无济于事:
1)在我的CMakeLists.txt
中,我添加了以下内容:
set(CMAKE_VERBOSE_MAKEFILE on)
没有任何效果。
2)我已经开始构建这样的内容:
./gradlew build --info
Gradle打印了一些东西,但没有编译器调用。
3)并且像这样:
./gradlew build --debug
Gradle打印了许多内容,但没有编译器调用。
所以这三次尝试都没有做到我想要的,这让我想知道我怎么能看到CMake如何在我的个人源文件上运行?
答案 0 :(得分:23)
在Android Studio中, gradle 会在模块根目录下为每个具有NDK集成的模块创建目录.externalNativeBuild
,通过CMake或ndk-build。
对于CMake,gradle插件非常详细。对于每个构建变体,它创建单独的子目录,例如, .externalNativeBuild/cmake/debug/x86
或.externalNativeBuild/cmake/release/armeabi-v7a
等
每个目录都包含一些有用的文件: cmake_build_command.txt 描述传递给CMake的实际参数; android_gradle_build.json 显示gradle插件为您的二进制文件派生的参数;从 build.ninja ,您可以推断出这些参数如何应用于每个编译或链接步骤。
对于ndk-build
,android_gradle_build.json
文件也非常有用。 ndkBuild_build_command.txt
列出了传递给 ndk-build 命令的所有参数,ndkBuild_build_output.txt
是该命令的未删节输出。您可以轻松地将 V=1
添加到参数中,例如
externalNativeBuild {
ndkBuild {
cppFlags "-std=c++11"
arguments "APP_STL=c++_static", "APP_OPTIM=release", "NDK_DEBUG=0", "V=1"
abiFilters "armeabi-v7a"
}
}
对于CMake
,相关参数为"-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON"
(请参阅 explanation
and alternatives ):
externalNativeBuild {
cmake {
cppFlags "-std=c++11"
arguments "-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON"
abiFilters "armeabi-v7a"
}
}
如果没有CMAKE_VERBOSE_MAKEFILE
,Gradle控制台会显示:
:app:externalNativeBuildDebug
Build native-lib armeabi-v7a
[1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o
[2/2] Linking CXX shared library ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libnative-lib.so
使用"-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON"
,我得到了大量的输出:
:app:externalNativeBuildDebug
Build native-lib armeabi-v7a
[1/2] /Users/alex/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv5te-none-linux-androideabi --gcc-toolchain=/Users/alex/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 --sysroot=/Users/alex/Library/Android/sdk/ndk-bundle/platforms/android-14/arch-arm -Dnative_lib_EXPORTS -isystem /Users/alex/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/include -isystem /Users/alex/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include -isystem /Users/alex/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/include/backward -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-integrated-as -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-integrated-as -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fno-limit-debug-info -O0 -fno-limit-debug-info -fPIC -MD -MT CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o -MF CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o.d -o CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o -c /Users/alex/test/egl/app/src/main/cpp/native-lib.cpp
[2/2] : && /Users/alex/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv5te-none-linux-androideabi --gcc-toolchain=/Users/alex/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 --sysroot=/Users/alex/Library/Android/sdk/ndk-bundle/platforms/android-14/arch-arm -fPIC -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-integrated-as -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-integrated-as -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fno-limit-debug-info -O0 -fno-limit-debug-info -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,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libnative-lib.so -o ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libnative-lib.so CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o -llog -lEGL -lGLESv2 -lm "/Users/alex/Library/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_static.a" "-latomic" && :
明显的文件.externalNativeBuild/cmake/debug/armeabi-v7a/cmake_build_output.txt
不包含有趣的信息(除非你的CMake配置本身有问题)。 Gradle不会将此输出写入文件,但您可以使用命令行重定向,请参阅Where are Gradle logs?。
答案 1 :(得分:0)
尝试更新您的Gradle版本。
答案 2 :(得分:0)
作为一个丑陋的解决方法,我用自己的可执行文件替换了忍者,该可执行文件将所有命令传递给真实的忍者可执行文件,并附加"-v"