mokky14's IT diary

IT関係の仕事メモ、勉強会の感想など書いてます。

Pro*Cのプリコンパイルでstddef.hが見つからないエラー発生

Pro*Cのプリコンパイル作業してたら、ヘッダが見つからないというエラーが出たのでその対処内容残しとく。

PCC-F-02102, Fatal error while doing C preprocessing
Error at line 30, column 10 in file /usr/include/sched.h
    30  #include <stddef.h>
    30  .........1
    30  PCC-S-02015, unable to open include file
以降、大量のエラーが続く

環境は、CentOS 6.2、Oracleクライアント10.2。

確かに、stddef.hは/usr/includeにはない。

$ ls /usr/include/stddef.h
ls: cannot access /usr/include/stddef.h: そのようなファイルやディレクトリはありません

調べてみたら、pcscfg.cfgの設定が原因。
$ORACLE_HOME/precomp/admin/pcscfg.cfgの設定は以下。

sys_include=(/build/s630/precomp/public,/usr/include,/opt/gcc33/lib64/gcc-lib/x86_64-suse-linux/3.3/include,/usr/lib/gcc-lib/x86_64-redhat-linux/3.2.3/include,/usr/lib64/gcc-lib/x86_64-suse-linux/3.3.3/include)
ltype=short
define=__x86_64__

Pro*Cはsys_includeの設定ディレクトリにシステムのヘッダ探しに行くようだが、指定されてたディレクトリにはstddef.hがなかった。

$ include_dir=/build/s630/precomp/public,/usr/include,/opt/gcc33/lib64/gcc-lib/x86_64-suse-linux/3.3/include,/usr/lib/gcc-lib/x86_64-redhat-linux/3.2.3/include,/usr/lib64/gcc-lib/x86_64-suse-linux/3.3.3/include
$ for dir in $(echo $include_dir|sed  "s/,/ /g")
> do
> ls $dir/stddef.h
> done
ls: cannot access /build/s630/precomp/public/stddef.h: そのようなファイルやディレクトリはありません
ls: cannot access /usr/include/stddef.h: そのようなファイルやディレクトリはありません
ls: cannot access /opt/gcc33/lib64/gcc-lib/x86_64-suse-linux/3.3/include/stddef.h: そのようなファイルやディレクトリはありません
ls: cannot access /usr/lib/gcc-lib/x86_64-redhat-linux/3.2.3/include/stddef.h: そのようなファイルやディレクトリはありません
ls: cannot access /usr/lib64/gcc-lib/x86_64-suse-linux/3.3.3/include/stddef.h: そのようなファイルやディレクトリはありません

環境によって置かれてるディレクトリは変わると思うけど、自分の環境だと、stddef.hは以下にあった。

$ ls -l  /usr/lib/gcc/x86_64-redhat-linux/4.4.4/include/stddef.h
-rw-r--r--. 1 root root 12542  2月 22 00:13 2013 /usr/lib/gcc/x86_64-redhat-linux/4.4.4/include/stddef.h

上記のstddef.hが置かれているディレクトリをpcscfg.cfgのsys_includeに追加することで、無事にプリコンパイル通った。