ust*_*ion 3 cmake android-ndk c++11
由谷歌提供了Android NDK是无法编译调用C++ 11种的功能,如std::to_string()和std::stoul等{我曾尝试在r10b一个从官方网站}.因此SO中的建议是尝试crystax NDK.我已下载并将根文件夹放在谷歌的NDK旁边.我在根CMakeLists.txt文件中更改的是:
从:
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 "")
Run Code Online (Sandbox Code Playgroud)
至:
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 "")
Run Code Online (Sandbox Code Playgroud)
和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
Run Code Online (Sandbox Code Playgroud)
至:
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
Run Code Online (Sandbox Code Playgroud)
即,从正常的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
Run Code Online (Sandbox Code Playgroud)
我可以在directorie中看到libcrystax.a和.so:
/some-path/android-ndk-r8-crystax-1/sources/crystax/libs/armeabi-v7a
Run Code Online (Sandbox Code Playgroud)
我尝试在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
Run Code Online (Sandbox Code Playgroud)
然后将其$HOME/arm-linux-androideabi用作基于cmake的构建系统的完全独立工具链.
但是请注意,由于Bionic(libc)的变化,使用CrystaX NDK r8构建的应用程序将无法在最新的Android 5.0上运行.以前的Android版本(<= 4.4)都很好.我们在即将发布的r10版本中修复了该问题(以及许多其他问题),该版本正处于最终测试阶段 与此同时,您可以将您的项目采用到我们的r8版本,并在完成时快速切换到r10 - 相同的方法将适用于r10以及r8.