@@ -474,7 +474,7 @@ elseif( ANDROID_STANDALONE_TOOLCHAIN )
474
474
set ( BUILD_WITH_STANDALONE_TOOLCHAIN True )
475
475
else ()
476
476
list (GET ANDROID_NDK_SEARCH_PATHS 0 ANDROID_NDK_SEARCH_PATH )
477
- message ( FATAL_ERROR "Could not find neither Android NDK nor Android standalone toolcahin .
477
+ message ( FATAL_ERROR "Could not find neither Android NDK nor Android standalone toolchain .
478
478
You should either set an environment variable:
479
479
export ANDROID_NDK=~/my-android-ndk
480
480
or
@@ -773,6 +773,27 @@ You are strongly recommended to switch to another NDK release.
773
773
" )
774
774
endif ()
775
775
776
+ if ( NOT _CMAKE_IN_TRY_COMPILE AND X86 AND ANDROID_STL MATCHES "gnustl" AND ANDROID_NDK_RELEASE STREQUAL "r6" )
777
+ message ( WARNING "The x86 system header file from NDK r6 has incorrect definition for ptrdiff_t. You are recommended to upgrade to a newer NDK release or manually patch the header:
778
+ See https://android.googlesource.com/platform/development.git f907f4f9d4e56ccc8093df6fee54454b8bcab6c2
779
+ diff --git a/ndk/platforms/android-9/arch-x86/include/machine/_types.h b/ndk/platforms/android-9/arch-x86/include/machine/_types.h
780
+ index 5e28c64..65892a1 100644
781
+ --- a/ndk/platforms/android-9/arch-x86/include/machine/_types.h
782
+ +++ b/ndk/platforms/android-9/arch-x86/include/machine/_types.h
783
+ @@ -51,7 +51,11 @@ typedef long int ssize_t;
784
+ #endif
785
+ #ifndef _PTRDIFF_T
786
+ #define _PTRDIFF_T
787
+ -typedef long ptrdiff_t;
788
+ +# ifdef __ANDROID__
789
+ + typedef int ptrdiff_t;
790
+ +# else
791
+ + typedef long ptrdiff_t;
792
+ +# endif
793
+ #endif
794
+ " )
795
+ endif ()
796
+
776
797
# setup paths and STL for NDK
777
798
if ( BUILD_WITH_ANDROID_NDK )
778
799
set ( ANDROID_TOOLCHAIN_ROOT "${ANDROID_NDK} /toolchains/${ANDROID_TOOLCHAIN_NAME} /prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME} " )
@@ -1048,6 +1069,11 @@ if( EXISTS "${__libstl}" OR EXISTS "${__libsupcxx}" )
1048
1069
set ( CMAKE_CXX_CREATE_SHARED_MODULE "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
1049
1070
set ( CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>" )
1050
1071
endif ()
1072
+ if ( X86 AND ANDROID_STL MATCHES "gnustl" AND ANDROID_NDK_RELEASE STREQUAL "r6" )
1073
+ # workaround "undefined reference to `__dso_handle'" problem
1074
+ set ( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \" ${ANDROID_SYSROOT} /usr/lib/crtbegin_so.o\" " )
1075
+ set ( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \" ${ANDROID_SYSROOT} /usr/lib/crtbegin_so.o\" " )
1076
+ endif ()
1051
1077
if ( EXISTS "${__libstl} " )
1052
1078
set ( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \" ${__libstl} \" " )
1053
1079
set ( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \" ${__libstl} \" " )
@@ -1111,10 +1137,13 @@ if( ANDROID_FUNCTION_LEVEL_LINKING )
1111
1137
set ( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--gc-sections" )
1112
1138
endif ()
1113
1139
1114
- if ( CMAKE_HOST_UNIX AND (ARMEABI_V7A OR X86 ) AND ANDROID_COMPILER_VERSION VERSION_EQUAL "4.6" )
1115
- if ( ANDROID_GOLD_LINKER )
1116
- set ( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -fuse-ld=gold" )
1117
- endif ()
1140
+ if ( ANDROID_GOLD_LINKER AND CMAKE_HOST_UNIX AND (ARMEABI OR ARMEABI_V7A OR X86 ) AND ANDROID_COMPILER_VERSION VERSION_EQUAL "4.6" )
1141
+ set ( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -fuse-ld=gold" )
1142
+ elseif ( ANDROID_NDK_RELEASE STREQUAL "r8b" AND ARMEABI AND ANDROID_COMPILER_VERSION VERSION_EQUAL "4.6" AND NOT _CMAKE_IN_TRY_COMPILE )
1143
+ message ( WARNING "The default bfd linker from arm GCC 4.6 toolchain can fail with 'unresolvable R_ARM_THM_CALL relocation' error message. See https://code.google.com/p/android/issues/detail?id=35342
1144
+ On Linux and OS X host platform you can workaround this problem using gold linker (default).
1145
+ Rerun cmake with -DANDROID_GOLD_LINKER=ON option.
1146
+ " )
1118
1147
endif ()
1119
1148
1120
1149
if ( ANDROID_NOEXECSTACK )
0 commit comments