Using Android NDK zlib breaks system include ordering
Hello,
The following test case disturbs system include path ordering of Android NDK r16:
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
project(testcase CXX)
file(WRITE testcase.cpp "#include <iostream>")
add_library(testcase STATIC testcase.cpp)
find_package(ZLIB REQUIRED)
target_link_libraries(testcase PRIVATE ZLIB::ZLIB)
Error:
/home/gregorj/Android/android-ndk-r16b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=aarch64-none-linux-android --gcc-toolchain=/home/gregorj/Android/android-ndk-r16b/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64 --sysroot=/home/gregorj/Android/android-ndk-r16b/sysroot -isystem /home/gregorj/Android/android-ndk-r16b/sysroot/usr/include -isystem /home/gregorj/Android/android-ndk-r16b/sources/cxx-stl/llvm-libc++/include -isystem /home/gregorj/Android/android-ndk-r16b/sources/android/support/include -isystem /home/gregorj/Android/android-ndk-r16b/sources/cxx-stl/llvm-libc++abi/include -isystem /home/gregorj/Android/android-ndk-r16b/sysroot/usr/include/aarch64-linux-android -funwind-tables -no-canonical-prefixes -D__ANDROID_API__=21 -fexceptions -frtti -g -fPIC -std=gnu++14 -MD -MT CMakeFiles/testcase.dir/testcase.cpp.o -MF CMakeFiles/testcase.dir/testcase.cpp.o.d -o CMakeFiles/testcase.dir/testcase.cpp.o -c ../testcase.cpp
In file included from ../testcase.cpp:1:
In file included from /home/gregorj/Android/android-ndk-r16b/sources/cxx-stl/llvm-libc++/include/iostream:40:
In file included from /home/gregorj/Android/android-ndk-r16b/sources/cxx-stl/llvm-libc++/include/istream:163:
In file included from /home/gregorj/Android/android-ndk-r16b/sources/cxx-stl/llvm-libc++/include/ostream:140:
/home/gregorj/Android/android-ndk-r16b/sources/cxx-stl/llvm-libc++/include/locale:807:12: error: use of undeclared identifier 'strtof_l'
return strtof_l(__a, __p2, _LIBCPP_GET_C_LOCALE);
^
/home/gregorj/Android/android-ndk-r16b/sources/cxx-stl/llvm-libc++/include/locale:813:12: error: use of undeclared identifier 'strtod_l'; did you mean 'strtold_l'?
return strtod_l(__a, __p2, _LIBCPP_GET_C_LOCALE);
^
/home/gregorj/Android/android-ndk-r16b/sysroot/usr/include/stdlib.h:237:13: note: 'strtold_l' declared here
long double strtold_l(const char* __s, char** __end_ptr, locale_t __l) __INTRODUCED_IN(21);
^
2 errors generated.
Before adding zlib the order was:
-isystem /home/gregorj/Android/android-ndk-r16b/sources/cxx-stl/llvm-libc++/include
-isystem /home/gregorj/Android/android-ndk-r16b/sources/android/support/include
-isystem /home/gregorj/Android/android-ndk-r16b/sources/cxx-stl/llvm-libc++abi/include
-isystem /home/gregorj/Android/android-ndk-r16b/sysroot/usr/include
-isystem /home/gregorj/Android/android-ndk-r16b/sysroot/usr/include/aarch64-linux-android
After adding zlib the order is as follows:
-isystem /home/gregorj/Android/android-ndk-r16b/sysroot/usr/include
-isystem /home/gregorj/Android/android-ndk-r16b/sources/cxx-stl/llvm-libc++/include
-isystem /home/gregorj/Android/android-ndk-r16b/sources/android/support/include
-isystem /home/gregorj/Android/android-ndk-r16b/sources/cxx-stl/llvm-libc++abi/include
-isystem /home/gregorj/Android/android-ndk-r16b/sysroot/usr/include/aarch64-linux-android
I guess zlib.h
living in /home/gregorj/Android/android-ndk-r16b/sysroot/usr/include
affects include order.
My CMake command line is:
~/src/cmake/_build/bin/cmake -DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=/home/gregorj/Android/android-ndk-r16b -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a -DCMAKE_SYSTEM_VERSION=21 -DCMAKE_ANDROID_STL_TYPE=c++_static -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang ..
Thanks, Gregor
Edited by Gregor Jasny