Número de referencia: DPD200248916
Versiones del producto:
- Compilador Intel® C++ para Android*, host Windows*
- Compilador Intel® C++ para Android*, host Linux*
- Compilador Intel® C++ para Android*, host OS X*
Descripción del problema:
Después de instalar el Compilador Intel C++ para Android, el sistema de compilación del NDK elige el compilador Intel como predeterminado para destinos x86. Esto se debe a la manera en que funciona el sistema de compilación. Mediante la opción V=1, se puede comprobar qué compilador se usa en realidad.
%NDK_DIR%\ndk-build V=1 -B APP_ABI=x86
......
C:/Intel/cc_android_14.0.0.014//bin/ia32/icc.exe -Wl,--as-needed -MMD -MP -MF ./obj/local/x86/objs-debug/hello-jni/hello-jni.o.d -ffunction-sections -m32 -O2 -g -DNDEBUG -fomit-frame-pointer -fstrict-aliasing -finline-limit=300 -O0 -UNDEBUG -fno-omit-frame-pointer -fno-strict-aliasing -Ijni -DANDROID -Wa,--noexecstack -Wformat -Werror=format-security -IC:/android-ndk-r9/platforms/android-9/arch-x86/usr/include -c jni/hello-jni.c -o ./obj/local/x86/objs-debug/hello-jni/hello-jni.o
Solución:
Elija una de las opciones de abajo para usar el compilador GCC en lugar del compilador Intel.
- Especifique explícitamente la cadena de herramientas, como se muestra en la línea siguiente:
%NDK_DIR%\ndk-build V=1 -B NDK_TOOLCHAIN=x86-4.6 APP_ABI=x86
La cadena de herramientas x86-4.6 selecciona la versión 4.6 del compilador GCC, que es la predeterminada para el NDK 9
Si quiere crear un archivo FAT APK y usar GCC como compilador para destinos x86, utilice la siguiente secuencia de comandos:%NDK_DIR%ndk-build V=1 -B NDK_TOOLCHAIN=x86-4.6 APP_ABI=x86 %NDK_DIR%ndk-build V=1 -B APP_ABI="armeabi armeabi-v7a mips" NDK_APP.local.cleaned_binaries=true
La opción
NDK_APP.local.cleaned_binaries=true
es una opción interna del NDK para prevenir que se vacíe el directorio de bibliotecas. Para hacer que GCC sea el compilador predeterminado como antes de instalar el Compilador Intel® C++, hay que cambiar los archivos make del sistema del NDK
El archivo que selecciona el compilador predeterminado es '%NDK_DIR%/build/core/setup-toolchain.mk'. Abra este archivo en el editor de texto que prefiera y busque el término "ifndef NDK_TOOLCHAIN". En la versión 9 del NDK, este término está en la línea 28.
# Comprobar que tenemos una cadena de herramientas que admite la ABI actual. # NOTA: si NDK_TOOLCHAIN está definida, vamos a usarla. # ifndef NDK_TOOLCHAIN TARGET_TOOLCHAIN_LIST := $(strip $(sort $(NDK_ABI.$(TARGET_ARCH_ABI).toolchains))) # Hay que descartar por filtro la cadena de herramientas Clang para # que GCC siga siendo la cadena de herramientas predeterminada. $(foreach _ver,$(LLVM_VERSION_LIST), $(eval TARGET_TOOLCHAIN_LIST := $(filter-out %-clang$(_ver),$(TARGET_TOOLCHAIN_LIST)))) # Hay que descartar por filtro 4.7 y 4.8, que se consideran experimentales en este momento TARGET_TOOLCHAIN_LIST := $(filter-out %4.7 %4.8,$(TARGET_TOOLCHAIN_LIST))
Hay que agregar las dos líneas siguientes directamente después de la sección que se ve arriba, para descartar por filtro ICC, mientras el sistema del NDK determina el compilador predeterminado:
# Hay que descartar por filtro x86-icc para que no sea el compilador predeterminado TARGET_TOOLCHAIN_LIST := $(filter-out x86-icc%,$(TARGET_TOOLCHAIN_LIST))
El resultado debería verse así:
# Comprobar que tenemos una cadena de herramientas que admite la ABI actual. # NOTA: si NDK_TOOLCHAIN está definida, vamos a usarla. # ifndef NDK_TOOLCHAIN TARGET_TOOLCHAIN_LIST := $(strip $(sort $(NDK_ABI.$(TARGET_ARCH_ABI).toolchains))) # Hay que descartar por filtro la cadena de herramientas Clang para # que GCC siga siendo la cadena de herramientas predeterminada. $(foreach _ver,$(LLVM_VERSION_LIST), $(eval TARGET_TOOLCHAIN_LIST := $(filter-out %-clang$(_ver),$(TARGET_TOOLCHAIN_LIST)))) # Hay que descartar por filtro 4.7 y 4.8, que se consideran experimentales en este momento TARGET_TOOLCHAIN_LIST := $(filter-out %4.7 %4.8,$(TARGET_TOOLCHAIN_LIST)) # Hay que descartar por filtro x86-icc para que no sea el compilador predeterminado TARGET_TOOLCHAIN_LIST := $(filter-out x86-icc%,$(TARGET_TOOLCHAIN_LIST)