system management
1748208 メンバー
2702 オンライン
108759 解決策
新規ポスト

gccでipc.hがエラー

 
saka
新しいメンバー

gccでipc.hがエラー

HP-UX11iV2でgcc3.4.2でもgcc3.3.3でも同じですが、

#include

#include

を含むソースをコンパイルしようとすると、

/usr/include/sys/ipc.h:51: error: parse error before "cid_t"

/usr/include/sys/ipc.h:56: error: parse error before '}' token

とか

/usr/include/sys/shm.h:82: error: field `shm_perm' has incomplete type

のようなエラーが出ます。

/usr/local/lib/gcc-lib/ia64-hp-hpux11.23/3.3.3/include/sys/types.h

を見に行って、cid_tが定義されていないためのようです。

使い方間違っているでしょうか?
4件の返信4
テレコム担当者
尊敬されているコントリビューター

gccでipc.hがエラー

-D_INCLUDE_POSIX_SOURCE を付けたらどうですか?
saka
新しいメンバー

gccでipc.hがエラー

-D_INCLUDE_POSIX_SOURCE を付けても変わりませんでした。

/usr/include/sys/types.h を /usr/local/lib/gcc-lib/ia64-hp-hpux11.23/3.3.3/include/sys/types.h に上書きして 取り合えずコンパイルは通りました。

正式な対応で無いとは思いますが、、。
st
頻繁なアドバイザー

gccでipc.hがエラー

エラーメッセージから HP-UX 11i v2 2004 年 9 月版 (以下 11.23 0409 とし

ます) をご使用になっていることがわかります。ところが、gcc のバイナリが

作られたときの /usr/include/sys/types.h と gcc が実際に使用する types.h

との同期が取れていない、異なっているためにこのエラーが発生しています。

gcc ソースをビルドする際に、システムのヘッダーファイルを自分のディレク

トリ下にコピーする仕組みを持っています。

今回のようにズレが生じている場合、mkheaders というツールを使用すること

で、gcc 用のヘッダーファイルを更新することが可能です。

私の環境では、昔インストールした gcc 3.4.1 が /usr/local にあるものの、

その後 OS が 11.23 から 11.23 0409 に変更になったために、cid_t に関す

る同じエラーが発生しています。

そこで、mkheaders を実行しました。

# /usr/local/libexec/gcc/ia64-hp-hpux11.23/3.4.1/install-tools/mkheaders

/usr/local/libexec/gcc/ia64-hp-hpux11.23/3.4.1/install-tools/mkheaders:

/usr/local/lib/gcc-lib/ia64-hp-hpux11.23/3.4.1/install-tools/mkheaders.conf:

not found.

この不具合については以下を参照してください。

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16842

これを参考に以下のように変更を施しました。

69c69

< libsubdir=${libdir}/gcc-lib/${target_noncanonical}/${version}

---

> libsubdir=${libdir}/gcc/${target_noncanonical}/${version}

この後もう一度 mkheaders を実行したのですが、今度は別のエラーが ...

なお、このエラーは自分の環境だけかもしれませんので、ご了承ください。

上述の bugzilla には "Fixed in both 3.4.2 and 3.5.0" とあるし、面倒く

さい (^_^;) ので、http://www.hp.com/go/gcc から最新の gcc 4.0.0 と

binutils 2.15.97 を入手しインストールしました。

インストール後の結果からこの gcc 4.0.0 は HP-UX 11.23 0409 で作られた

ことがわかります。つまり、

/usr/local/lib/gcc/ia64-hp-hpux11.23/4.0.0/include/sys/types.h に以下

のように、cid_t の定義が最初から含まれています。

# ifndef _CMPTID_T

# define _CMPTID_T

typedef int32_t cid_t; /* For compartment IDs */

typedef cid_t cmpt_t;

# endif /* _CMPTID_T */

こうなればしめたもので、cid_t に関するエラーが出なくなりました

(gtk+-1.2.10 で検証できました)。

以上、ご参考までに。

saka
新しいメンバー

gccでipc.hがエラー

ありがとうございました。

gccがビルドされる時に、その時点でのシステムヘッダーファイルを利用しているということ、理解できました。

私は、mkheadersを利用しませんでしたが、そのようなことが出来るのですね。

非常に参考になりました。