この記事は、インテル® Developer Zone に公開されている「Changing the default compiler back from Intel C++ Compiler to GCC for x86 targets」 (http://software.intel.com/en-us/articles/Changing-the-default-compiler-back-from-Intel-C%2B%2B-Compiler-to-GCC-for-x86-targets) の参考訳です。
製品バージョン:
- インテル® C++ コンパイラー Android* 向け Windows* 版
- インテル® C++ コンパイラー Android* 向け Linux* 版
- インテル® C++ コンパイラー Android* 向け OS X* 版
問題の説明:
インテル® C++ コンパイラー Android* 向けをインストールすると、NDK ビルドシステムは x86 ターゲットのデフォルト・コンパイラーとしてインテル® コンパイラーを選択します。これは、NDK ビルドシステムの動作方法によるものです。V = 1 オプションを設定すると、コンパイルに使用されているコンパイラーを確認することができます。
%NDK_DIR%\ndk-build V=1 –B
…
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
解決方法:
インテル® コンパイラーの代わりに GCC* コンパイラーを使用する場合、次のオプションのいずれかを選択します。
- NDK_TOOLCHAIN を以下のように指定します。
%NDK_DIR%\ndk-build V=1 -B NDK_TOOLCHAIN=x86-4.6 APP_ABI=x86NDK_TOOLCHAIN=x86-4.6 は、NDK 9 のデフォルトである GCC* コンパイラーのバージョン 4.6 を選択します。
x86 ターゲット用のコンパイラーとして GCC* を使用して FAT APK ファイルを作成するには、次のコマンド・シーケンスを使用します。
12%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
NDK_APP.local.cleaned_binaries=true オプションは、libs ディレクトリーのクリーンアップを抑制する NDK の内部オプションです。
- インテル® C++ コンパイラー Android* 向けをインストールする以前のように GCC* をデフォルト・コンパイラーにするには、NDK ビルドシステムの make ファイルを変更する必要があります。
デフォルト・コンパイラーは、’%NDK_DIR%/build/core/setup-toolchain.mk’ ファイルで選択されます。テキストエディターでこのファイルを開いて、”ifndef NDK_TOOLCHAIN” を検索してください。NDK バージョン 9 では、28 行目で見つかりました。
12345678910111213# Check that we have a toolchain that supports the current ABI.
# NOTE: If NDK_TOOLCHAIN is defined, we're going to use it.
#
ifndef NDK_TOOLCHAIN
TARGET_TOOLCHAIN_LIST := $(strip $(sort $(NDK_ABI.$(TARGET_ARCH_ABI).toolchains)))
# Filter out the Clang toolchain, so that we can keep GCC as the
default
# toolchain.
$(foreach _ver,$(LLVM_VERSION_LIST),
$(eval TARGET_TOOLCHAIN_LIST :=
$(filter-out %-clang$(_ver),$(TARGET_TOOLCHAIN_LIST))))
# Filter out
4.7
and
4.8
which is considered experimental at
this
moment
TARGET_TOOLCHAIN_LIST := $(filter-out %
4.7
%
4.8
,$(TARGET_TOOLCHAIN_LIST))
NDK ビルドシステムがデフォルト・コンパイラーを決定する際に ICC を除外するよう、上記に 2 つの行を追加する必要があります。
12# Filter out x86-icc so that is will not be
default
compiler
TARGET_TOOLCHAIN_LIST := $(filter-out x86-icc%,$(TARGET_TOOLCHAIN_LIST))
以下は変更後のコードです。
123456789101112131415# Check that we have a toolchain that supports the current ABI.
# NOTE: If NDK_TOOLCHAIN is defined, we're going to use it.
#
ifndef NDK_TOOLCHAIN
TARGET_TOOLCHAIN_LIST := $(strip $(sort $(NDK_ABI.$(TARGET_ARCH_ABI).toolchains)))
# Filter out the Clang toolchain, so that we can keep GCC as the
default
# toolchain.
$(foreach _ver,$(LLVM_VERSION_LIST),
$(eval TARGET_TOOLCHAIN_LIST :=
$(filter-out %-clang$(_ver),$(TARGET_TOOLCHAIN_LIST))))
# Filter out
4.7
and
4.8
which is considered experimental at
this
moment
TARGET_TOOLCHAIN_LIST := $(filter-out %
4.7
%
4.8
,$(TARGET_TOOLCHAIN_LIST))
# Filter out x86-icc so that is will not be
default
compiler
TARGET_TOOLCHAIN_LIST := $(filter-out x86-icc%,$(TARGET_TOOLCHAIN_LIST)
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。