如何设置构建环境变量以将Clang用作NDK的一部分?

Pol*_*Pol 3 android-ndk

最新版本NDK R11说:

我们强烈建议您切换到Clang.

使用NDK建立类似的OpenSSL开放源码库时,你怎么在这在实践中,你需要将所有像通常的环境变量CPP,CC,CXX,等...?

我看到的llvm/prebuilt/darwin-x86_64/bin/clangclang++,但没有cppld工具,等等.相反的是在arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin拥有阳光下的每一个工具可能.

我们应该混合搭配吗?即使用ldcpparm-linux-androideabi-4.9同时clangllvm

[更新]作为参考,这是我使用r10 NDK的配置:

API_LEVEL="18"

HOST="arm-linux-androideabi"

export ANDROID_NDK="$HOME/Library/Android/sdk/ndk-bundle"

export NDK_PLATFORM="$ANDROID_NDK/platforms/android-$API_LEVEL/arch-arm"
export NDK_TOOLCHAIN="$ANDROID_NDK/toolchains/$HOST-4.9/prebuilt/darwin-x86_64"

export CPP="$NDK_TOOLCHAIN/bin/$HOST-cpp --sysroot=$NDK_PLATFORM"
export CC="$NDK_TOOLCHAIN/bin/$HOST-gcc --sysroot=$NDK_PLATFORM"
export CXX="$NDK_TOOLCHAIN/bin/$HOST-g++ --sysroot=$NDK_PLATFORM"
export LD="$NDK_TOOLCHAIN/bin/$HOST-ld --sysroot=$NDK_PLATFORM"
export AR="$NDK_TOOLCHAIN/bin/$HOST-ar"
export RANLIB="$NDK_TOOLCHAIN/bin/$HOST-ranlib"
Run Code Online (Sandbox Code Playgroud)

mst*_*sjo 5

是的,当使用clang时,它会退回到使用常规gcc工具链中的某些常规gnu binutils。(clang / llvm环境正在获得自己的链接器lld,但我相信NDK中的构建仍仅使用gnu binutils版本)。

与gcc工具链相反,NDK中只有一个llvm / clang工具链,可以针对所有必要的拱门。这也意味着您需要将参数传递给它,以告诉它要为其编译的内容。

对于您的构建脚本,您应该至少能够用以下内容替换CC和CXX:

export CC="$ANDROID_NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -target armv7-none-linux-androideabi -gcc-toolchain $NDK_TOOLCHAIN"
export CXX="$ANDROID_NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -target armv7-none-linux-androideabi -gcc-toolchain $NDK_TOOLCHAIN"
Run Code Online (Sandbox Code Playgroud)

对于CPP,AR和RANLIB,最好使用与现在相同的方法。对于LD,如果您当前直接指的是低级ld工具,则可能应该坚持下去。如果要使用gcc前端进行链接,则应将其切换为使用clang。但是在那种情况下,脚本可能会$CC用于链接而不是使用链接$LD


Dan*_*ert 5

另一种方法是使用build/tools/make_standalone_toolchain.py.这将构建一个完整的工具链目录,您可以直接调用clang而无需担心管理-gcc-toolchain--sysroot自己.

编辑:更新以引用新工具并删除警告部分,因为那里的问题现在都应该修复.

  • "他们"实际上是我:)我现在更新了我的答案.感谢您的提醒! (2认同)