デフォルト・コンパイラーをインテル® C++ コンパイラーから x86 ターゲットの gcc コンパイラーへ戻す

同カテゴリーの次の記事

Windows* アプリケーションのサポートについて

この記事は、インテル® Developer Zone に公開されている「Changing the default compiler back from Intel C++ 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* コンパイラーを使用する場合、次のオプションのいずれかを選択します。

  1. NDK_TOOLCHAIN を以下のように指定します。
    %NDK_DIR%\ndk-build V=1 -B NDK_TOOLCHAIN=x86-4.6 APP_ABI=x86

    NDK_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 の内部オプションです。

  2. インテル® 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)
    

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事