この記事は、インテル® 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 ファイルを作成するには、次のコマンド・シーケンスを使用します。
%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 行目で見つかりました。
# 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 つの行を追加する必要があります。
# Filter out x86-icc so that is will not be default compiler TARGET_TOOLCHAIN_LIST := $(filter-out x86-icc%,$(TARGET_TOOLCHAIN_LIST))
以下は変更後のコードです。
# 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)
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。