使用crystax NDK交叉编译手臂

时间:2014-11-13 06:53:17

标签: c++11 android-ndk cmake

谷歌提供的android ndk无法编译对{+ 1}}和std::to_string()等c ++ 11函数的调用。{我曾在std::stoul官方试过它现场}。因此SO中的建议是尝试r10b。我已下载并将根文件夹放在谷歌的NDK旁边。我在根CMakeLists.txt文件中更改的所有内容是:

从:

crystax NDK

要:

set(PLATFORM_PREFIX            "/some-path/android-ndk-r10b/platforms/android-19/arch-arm")
set(PLATFORM_FLAGS             "-fPIC -Wno-psabi --sysroot=${PLATFORM_PREFIX}")
set(CMAKE_CXX_FLAGS            "${PLATFORM_FLAGS} -march=armv7-a -mfloat-abi=softfp -mfpu=neon" CACHE STRING "")

和cmake命令行来自:

set(PLATFORM_PREFIX            "/some-path/android-ndk-r8-crystax-1/platforms/android-14/arch-arm")
set(PLATFORM_FLAGS             "-fPIC -Wno-psabi --sysroot=${PLATFORM_PREFIX}")
set(CMAKE_CXX_FLAGS            "${PLATFORM_FLAGS} -march=armv7-a -mfloat-abi=softfp -mfpu=neon" CACHE STRING "")

要:

cmake .. -DCMAKE_CXX_COMPILER=/some-path/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ -DCMAKE_C_COMPILER=/some-path/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -DANDROID_BUILD=ON -DANDROID_NDK_ROOT=/some-path/android-ndk-r10b

即,从正常的ndk变为crystax-ndk。该程序以前编译得很好,直到它试图通过调用std :: to_string()等编译一个文件。但是在更改之后Cmake给出了一个错误,它无法编译一个简单的测试程序,因为:

cmake .. -DCMAKE_CXX_COMPILER=/some-path/android-ndk-r8-crystax-1/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ -DCMAKE_C_COMPILER=/some-path/android-ndk-r8-crystax-1/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -DANDROID_BUILD=ON -DANDROID_NDK_ROOT=/some-path/android-ndk-r8-crystax-1

我可以在directorie中看到libcrystax.a和.so:

  /some-path/android-ndk-r8-crystax-1/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.7/../../../../arm-linux-androideabi/bin/ld:
  error: cannot find -lcrystax

我尝试在CMakeLists.txt文件的开头添加link_directories(" path-to-above"),但也没有解决它。

它应该在那里找到它(在我提供--sysroot等之后)就像正常的ndk一样。那怎么解决呢?要设置的任何其他cmake变量还是什么?

1 个答案:

答案 0 :(得分:5)

我不知道你的基于cmake的构建系统是如何工作的,但实际上如果你正确地将路径/some-path/android-ndk-r8-crystax-1/sources/crystax/libs/armeabi-v7a添加到链接器搜索路径,它应该找到libcrystax并成功链接它。

请注意,NDK有几个部分彼此分开 - 即sysroot,libcrystax,C ++库 - 所有部分都是分开的。它与NDK构建系统一起工作,它提供了一些选择C ++标准库实现的灵活性,NDK构建系统知道在哪里可以找到它们。在你的情况下,这种方法并不是那么好,所以我建议你首先制作独立的工具链,其中包含组装在一起的所有东西。换句话说,它将是经典的交叉编译工具链,它在编译器/链接器已知的位置包含sysroot,libcrystax和GNU C ++标准库,而不传递任何其他选项。

要创建此类工具链,请cd到NDK根目录并运行以下命令:

./build/tools/make-standalone-toolchain.sh --system=linux-x86_64 --toolchain=arm-linux-androideabi-4.7 --platform=android-14 --install-dir=$HOME/arm-linux-androideabi

然后使用$HOME/arm-linux-androideabi作为基于cmake的构建系统的完全独立工具链。

但请注意,由于Bionic(libc)的变化,使用CrystaX NDK r8构建的应用程序无法在最新的Android 5.0上运行。以前的Android版本(< = 4.4)都很好。我们在即将发布的r10版本中修复了该问题(以及许多其他问题),该版本正处于最终测试阶段与此同时,您可以将您的项目应用到我们的r8版本,并在完成时快速切换到r10 - 相同的方法将适用于r10以及r8。