この記事は、インテル® デベロッパー・ゾーンに掲載されている「Using Intel® C++ Compiler for Embedded System」(http://software.intel.com/en-us/articles/using-intel-c-compiler-for-embedded-system) の日本語参考訳です。
インテル® C++ コンパイラー (icc) は、Linux* オペレーティング・システム向け C/C++ アプリケーションのビルドおよび最適化を行うハイパフォーマンスなコンパイラーであり、さまざまな組込み Linux* システムをサポートしています。インテル® C++ コンパイラーの各種機能を利用して、新しいプロジェクトを作成したり、GNU* コンパイラーの既存のプロジェクトを簡単に移行することができます。
組込みシステム開発は、ほとんどの場合クロスプラットフォーム開発です。通常、アプリケーション開発にはクロスコンパイル環境が必要で、加えてホスト・コンパイル・システムとターゲット組込みシステムが必要になります。インテル® C++ コンパイラーは、クロスプラットフォームのコンパイルも完全にサポートしています。インテル® C++ コンパイラーは、IA ベースの組込みシステム向けにアプリケーションを開発し、最高のパフォーマンスを引き出せる最良のソリューションです。
インテル® C++ コンパイラーは、インテル® System Studio Linux* 版に含まれるコンポーネントの 1 つです。ここでは次のトピックについて説明します。
- インテル® C++ コンパイラーの組込み OS サポート
- インテル® C++ コンパイラーのクロスコンパイル
- インテル® C++ コンパイラーのランタイム・ライブラリー
- GNU* コンパイラーからインテル® C++ コンパイラーへの移行
- インテル® C++ コンパイラーと GNU* コンパイラーの互換性
インテル® C++ コンパイラーの組込み OS サポート
インテル® C++ コンパイラーは、以下を含むさまざまなホスト OS をサポートしています。
ホスト OS ディストリビューション |
バージョン |
Red Hat* Enterprise Linux* |
5、6 |
Ubuntu* |
10.04 LTS、11.04、11.10、12.04 LTS |
openSUSE |
12.1 |
SUSE LINUX Enterprise Server* |
10 SP4、11 SP2 |
Debian* |
6.0 |
Pardus* |
2011.2 (x64 のみ) |
インテル® C++ コンパイラーは、次のターゲット・プラットフォームをサポートしています。
Yocto Project* 1.2、1.3 ベースの環境
CE Linux* PR28 ベースの環境
Wind River* Linux* 5 ベースの環境
Fedora* 14 ベースの環境
インテル® C++ コンパイラーを利用したクロスコンパイル
インテル® C++ コンパイラーは、環境ファイルを使用することで、クロスコンパイルを完全にサポートしています。インテル® System Studio をインストールすると、インストール・フォルダーに複数の .env ファイルが配置されます。“-platform” オプションとともにこれらの .env ファイルを選択することで、特定のターゲット OS 向けにアプリケーションをコンパイルすることができます。
一般に、組込みターゲット向けにアプリケーションをコンパイルする場合は、SDK (ソフトウェア開発キット) をインストールまたはビルドし、SYSROOT (ターゲットシステムのルート) を設定する必要があります。SDK には、gcc* クロスコンパイラーを使ってターゲットシステム向けにアプリケーションをコンパイルするのに必要な gnu binutils、gnu* クロスコンパイラー、ライブラリー、ヘッダーファイルなど、さまざまなツールが含まれています。SYSROOT には、クロスコンパイルに必要なターゲットシステムのライブラリーとヘッダーファイルのパス、および glibc ライブラリーとヘッダーファイルのパスが含まれています。
インテル® C++ コンパイラーのクロスコンパイルには、SDK と SYSROOT が必要です。インテル® C++ コンパイラーは、gcc* クロスコンパイラーのパスを参照してコンパイル時に GNU* ツールのフォルダー構造を検出し、コンパイル後に gnu* の “ar” コマンドと “ld” コマンドを呼び出して最終アーカイブの作成とリンクを行います。また、SYSROOT のパスから、コンパイル時に正しいシステムファイル、glibc ヘッダーファイル、ライブラリーなどを追加します。
インテル® C++ コンパイラーが必要とするすべての情報は、コンパイラーのパッケージに含まれる環境ファイルで定義されています。開発者が行わなければならないのは、環境変数を通して SDK と SYSROOT へのパスをコンパイラーに知らせ、-platform= オプションで正しいターゲット・プラットフォームを指定することです。
例えば、Yocto 1.2 Project* ターゲット向けにアプリケーションをコンパイルするには、YL_SYSROOT および YL_TOOLCHAIN 環境変数を次のように設定します。
YL_SYSROOT=/opt/poky/1.2/sysroots/i586-poky-linux
YL_TOOLCHAIN=/opt/poky/1.2/sysroots/i686-pokysdk-linux/usr/bin
そして、次のコマンドを実行してソースファイルをコンパイルします。
$ icpc -platform=yl12 my_source_file.c
“yl12” はプラットフォーム名で、“yl12.env” 環境ファイルに対応します。このファイルは、インテル® System Studio のインストール・フォルダー (/opt/intel/system_studio_2013.0.xxx/bin/ia32/) にあります。
同様に、Wind River* Linux* 5 ターゲットシステムの場合、次のように環境変数を設定します。
WRL_TOOLCHAIN=<install_dir>/wrl50/wrlinux-5/layers/wr-toolchain/4.6-60
WRL_SYSROOT=<install_dir>/wrl50/<target>/export/sysroot/intel-xeon-core_glibc_std/bitbake_build/tmp/sysroots/intel-xeon-core
<install_dir> は Wind River* Linux* ソフトウェア開発キットのインストール・パスです (例: /export/SDK)。 <target> は ia32 または intel64 です。次のコマンドを実行してアプリケーションをコンパイルできます。
$ icc -platform=wrl50 my_source_file.c
対応する環境ファイルは <install_dir>/bin/<target> にあります。<install_dir> は /opt/intel/system_studio_2013.0.xxx、<target> は ia32 または intel64 です。xxx は、インテル® System Studio のリビジョン番号です。
次の表は、各ターゲット組込み OS 用の環境変数と対応するコンパイラー・オプションです。
ターゲット OS |
環境変数 |
コンパイラー・オプション |
Yocto Project* 1.2 |
YL_SYSROOT YL_TOOLCHAIN |
-platform=yl12 |
Yocto Project* 1.3 |
YL_SYSROOT YL_TOOLCHAIN |
-platform=yl13 |
CE Linux* |
CEL_TOOLCHAIN CEL_SYSROOT |
-platform=celpr28 |
Wind River* Linux*5 |
WRL_TOOLCHAIN WRL_SYSROOT |
-platform=wrl50 |
Fedora* 14 ベースのターゲット環境では、使用状況によっては、ほかの組込みシステムとクロスコンパイル・サポートがやや異なります。
ホストシステムとターゲットシステムが同一の場合 (つまり、gnu* ツールのバージョン、OS カーネルのバージョン、glibc のバージョンなどが同じ場合)、ホスト上のネイティブ・コンパイラーと同じようにインテル® C++ コンパイラーを使用できます。この場合、ビルドしたバイナリーをターゲットシステムにコピーするだけで実行できます。
–sysroot オプションで (ホストのデフォルトの sysroot ではなく) ターゲット Linux* システムの SYSROOT を指定し、ホストのネイティブ gnu* ツールを使用してコンパイルする場合は、インテル® C++ コンパイラーを –sysroot オプションとともに使用できます。インテル® C++ コンパイラーは、ターゲットシステム向けに異なるシステムルートを指定できる –sysroot オプションをサポートしています。例えば、ヘッダーとライブラリーが通常の場所 (/usr/include と /usr/lib) にある場合、–sysroot=/mydir を指定すると、コンパイラーは /mydir/usr/include と /mydir/usr/lib にあるヘッダーとライブラリーを検索します。
セルフビルドの gnu* クロスツールの場合は、独自の環境ファイルを定義し、-platform= オプションを使用しなければならないことがあります。カスタマイズされたクロスツールとターゲット OS 用の新しい環境ファイルの作成については、インテル® テクニカルサポートまでお問い合わせください。
テクニカルサポートに関する情報は、http://software.intel.com/en-us/intel-system-studio (英語) を参照してください。
インテル® C++ コンパイラーのランタイム・ライブラリー
インテル® C++ コンパイラーでビルドしたアプリケーションを動的にリンクする場合は、ターゲットシステム上でインテル® C++ コンパイラーのランタイム・ライブラリーを利用できるようにしなければなりません。そのためには、次の操作を行います。
1. ツールスイートのパッケージを書き込みアクセス権のあるディレクトリーに展開します。
$ tar -zxvf l_cembd_p_2013.0.xxx.tgz
2. ftp、sftp、または scp を使用して、作成されたディレクトリー ../l_cembd_b_2013.0.xxx/rpm/ にある system_studio_target.tgz をターゲットデバイスにコピーします。
3. ターゲットデバイス上で、このファイルを書き込みアクセス権のあるディレクトリーに展開します。
$ tar -zxvf system_studio_target.tgz
4. ../system_studio_target/ ディレクトリーが作成され、../system_studio_target/compiler/lib 以下にライブラリーが配置されます。
5. ライブラリーをシステムフォルダーにコピーしてバイナリーの実行時に直接参照されるようにするか、またはバイナリーを実行する前に LD_LIBRARY_PATH 環境変数にライブラリーのパスを追加します。
GNU* コンパイラーからインテル® C++ コンパイラーへの移行
コンパイラーの役割は、C/C++ ソースプログラムをバイナリーに変換し、最適化することです。コンパイルを行うと、C/C++ ソースファイルからオブジェクト・ファイル (.o ファイル) が生成されます。リンカー (ld) は、すべてのオブジェクト・ファイルとその他のシステム・ライブラリーを最終的な実行ファイルにリンクします。 インテル® C++ コンパイラーは、GNU* ツールを認識し、コンパイル後に自動でリンカーを起動します。インテル® C++ コンパイラーは独自のリンカーを提供していません。リンク段階で GNU* リンカーを呼び出します。同様に、アーカイブでも、インテル® C++ コンパイラーは GNU* の “ar” コマンドを使用してアーカイブを作成します。これらすべての自動処理は、インテル® コンパイラーのドライバー (icc、icpc、xiar および xild) によって行われます。
“icc” と “icpc” は、インテル® C++ コンパイラーの起動コマンドです。コンパイル時に C/C++ ソースコードからオブジェクト・ファイルを生成したり、リンク段階で gnu* リンカーを自動で呼び出して複数のバイナリーを 1 つのバイナリーにリンクします。
“xiar” は、“ar” に相当するインテル® コンパイラーのコマンドです。複数のアーカイブファイルに対してさまざまな最適化を行い (可能な場合)、自動で GNU* の “ar” を呼び出してすべてのファイルを 1 つのライブラリーにアーカイブします。
“xild” は、“ld” に相当するインテル® コンパイラーのコマンドです。クロスファイルの最適化を実行してから、GNU* リンカー “ld” を呼び出します。
GNU* の gcc* コンパイラーからインテル® C++ コンパイラーへプロジェクトを簡単に切り替えられます。インテル® C++ コンパイラーへ移行する場合は、次の表を参考にしてください。
|
CC |
CXX |
LD |
AR |
||
GNU* コンパイラー |
gcc |
g++ |
gcc |
g++ |
ld |
ar |
インテル® C++ コンパイラー |
icc |
icpc |
icc |
icpc |
xild |
xiar |
以下は、makefile を使用してビルドするアプリケーションを gcc から icc へ移行する基本的なステップです。
1. 変数 CC を gcc から icc に、CXX を g++ から icpc に、LD が gcc の場合は icc に、LD が g++ の場合は icpc に、LD が ld の場合は xild に、AR を ar から xiar にそれぞれ変更します。
2. クロスコンパイルの場合は、“icc” と “icpc” に -platform=<val> オプションを追加します。
3. クロスコンパイルの場合は、“xiar” と “xild” に -qplatform=<val> オプションを追加します。このオプションにより、“xiar” と “xild” が正しいクロスコンパイル用の “ar” と “ld” を呼び出します。通常、クロスコンパイル用の “ar” と “ld” には、“i686-pc-linux-ar” や “i686-pc-linux-ld” のようにプリフィックスが付いています。-qplatform オプションの <val> は、“icc” と “icpc” で使用される -platform オプションの <val> と同じです。
4. リンク に “icc” または “icpc” を使用すると、インテル® C++ コンパイラーはリンク段階でインテル® C++ コンパイラーのライブラリーを自動でリンクします。リンクに “ld” を使用すると、“xild” に変更後、インテル® C++ コンパイラーのライブラリーを手動で追加しなければならないことがあります。例えば、-L/opt/intel/system_studio_2013.0.xxx/compiler/lib/<arch> オプションを “xild” に追加します。<arch> はターゲット・アーキテクチャーで “ia32” または “intel64” です。さらに、リンカーが正しいインテル・ライブラリーを最終実行ファイルにリンクできるように、-lirc -limf -lsvml などのリンクオプションを “xild” に追加します。そうしない場合、リンカーはインテル・ライブラリーの関数が未定義であると報告します。
5. ほとんどの場合、これでインテル® C++ コンパイラーでプロジェクトをコンパイルできるようになります。
6. 次のステップは、インテル® C++ コンパイラー固有の最適化オプションを追加することです。これは別のトピックなのでここでは取り上げません。次の記事を参照してください。
Step by Step Performance Optimization with Intel® C++ Compiler (http://software.intel.com/en-us/articles/step-by-step-optimizing-with-intel-c-compiler)
インテル® C++ コンパイラーと GNU* コンパイラーの互換性
インテル® C++ コンパイラーは GNU* コンパイラーと互換性があります。GNU* の一般的なオプションと言語拡張の多くは、インテル® C++ コンパイラーでサポートされています。インテル® C++ コンパイラーと GNU* コンパイラーの互換性については、次のホワイトペーパーで詳しく説明しています。
Intel® C++ Compiler for Linux* – Compatibility with the GNU* compilers (http://software.intel.com/en-us/articles/intel-c-compiler-for-linux-compatibility-with-the-gnu-compilers/)
また、インテル® C++ コンパイラーは、GNU* コンパイラーよりも厳しくソースコードをチェックします。ほとんどの場合は警告メッセージが出力されますが、致命的なエラーが出力されることもあります。gcc* ビルドで -Werror オプションを使用している場合、icc でビルドする前にこのオプションを削除してください。そうしないと、インテル® C++ コンパイラーの警告により、多数のエラーが出力される可能性があります。コードの品質を向上させるため、インテル® C++ コンパイラーの警告を調査することを強く推奨します。警告を出力したくない場合は、-diag-disable <v1>[,<v2>,…] オプションにより、指定した診断または診断グループを無効にできます。<vN> は診断メッセージの ID 番号または診断グループ名です。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。