使用crystax NDK对arm进行交叉编译

2023-12-14

google 提供的 android ndk 无法编译对 c++11 函数的调用,例如std::to_string() and std::stoul等等{我曾尝试过r10b来自官方网站的一张}。所以SO中的建议是尝试crystax NDK。我已经下载并将根文件夹放在谷歌的NDK旁边。我在根 CMakeLists.txt 文件中所做的更改是:

from:

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 "")

To:

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 命令行来自:

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

To:

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

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

  /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

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

/some-path/android-ndk-r8-crystax-1/sources/crystax/libs/armeabi-v7a

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

它应该在那里找到它(在我提供上面的 --sysroot 等之后),就像普通的 ndk 一样。那么这个问题应该如何解决呢?还有其他要设置的 cmake 变量吗?


我不知道你的基于 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 版本(

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用crystax NDK对arm进行交叉编译 的相关文章

随机推荐