雑記帳

ちょっとした文章とかメモ書きとか。

Ubuntu11.10でICCのコンパイルエラー

Ubuntu11.10の32bit版でIntel Compiler12.0を久々に使おうとしたらつまずいたのでメモ。

環境

Ubuntu 11.10: x86版(32bit)
icc:12.0.5

えっ?ヘッダーが見つからない?

ヘッダーがICCから見えてなかったようです。

/usr/include/gnu/stubs.h(7): catastrophic error: gnu/stubs-32.h:No such file or directory.

え、何これと思っていたらアーキテクチャ依存のヘッダーファイルなようです。

もうひとつ

/usr/include/features.h(323): catastrophic error: cannot open file "bits/predefs.h".

こんなエラーも出てしまいました。原因はUbuntuはDebian系Linuxなため、/usr/includeにヘッダーファイルが直に置かれているのではなく、アーキテクチャ依存のヘッダーファイルはアーキテクチャを表すフォルダにまとめて置かれているからです。

どうやって解決しよう??

探すとこんな記事を発見しました:
Ubuntu11.10に Intel(R) C++ Studio XE 2011 SP1 Update 1 for Linux
http://d.hatena.ne.jp/next49/20120126/p1

どうやら同じところでつまずいているようです。

結論から言うと/usr/include/i386-linux-gnuをICCのインクルードディレクトリに含ませるようにすれば良いとのこと。

その記事によるとシンボリックリンクを

$ sudo ln -s /usr/include/i386-linux-gnu* /usr/include

として/usr/includeを見るだけでコンパイラから見えるようにしまうのが一番楽だそうです。

ですが、このことによりアーキテクチャによりヘッダーファイルのディレクトリを分けている意味がなくなってしまいます。よってここでは違う方法を取ります。

折角シェルを使っているのでエイリアスの機能を使ってしまいましょう。

エイリアスを活用してみる

bashシェルを使っている場合は~/.bash_aliases~/.bashrc

#for Intel Compiler architecture header include problem
alias icpc='icpc -I /usr/include/i386-linux-gnu'
alias icc='icc -I /usr/include/i386-linux-gnu'

とします。

csh/tcshでは~/.cshrcなどに

#for Intel Compiler architecture header include problem
alias icpc 'icpc -I /usr/include/i386-linux-gnu'
alias icc 'icc -I /usr/include/i386-linux-gnu'

としてエイリアスを定義します。すると/usr/include/i386-linux-gnuの下にはgnu/stubs-32.hbits/predefs.hも存在するのでインクルードでつまずくことはなくなります。

では。

追記:

$sudo ln -s /usr/include/(i386|x86_64)-linux-gnu/gnu /usr/include/gnu

として/usr/include/gnuにリンクを貼るのも有効な解決策です。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。