ORACLE 10.2 Pro*C precompiler not reading header file

From Metalink

PCC-S-02201, Encountered the symbol "size_t" when expecting one of the 
following
:
   ... auto, char, const, double, enum,  float, int, long,
   ulong_varchar, OCIBFileLocator OCIBlobLocator,
   OCIClobLocator, OCIDateTime, OCIExtProcContext, OCIInterval,
   OCIRowid, OCIDate, OCINumber, OCIRaw, OCIString, register,
   short, signed, sql_context, sql_cursor, static, struct,
   union, unsigned, utext, uvarchar, varchar, void, volatile,
   a typedef name, exec oracle, exec oracle begin, exec,
   exec sql, exec sql begin, exec sql type, exec sql var,
The symbol "enum," was substituted for "size_t" to continue.
Syntax error at line 88, column 7, file /usr/include/gconv.h:
Error at line 88, column 7 in file /usr/include/gconv.h
                                  size_t *);

Solution Description

The 'sys_include' and 'include' precompiler options are not set correctly. Set 'sys_include' and 'include' precompiler options in the pcscfg.cfg file located at $ORACLE_HOME/precomp/admin or include on the command line when invoking 'proc'.

For example, here is a recommended way to set the variable properly:

Run the following command to obtain the compiler location:

gcc -v

Reading specs from /usr/lib/gcc-lib/i386-redhat-linux7/2.96/specs gcc version 2.96 20000731 (Red Hat Linux 7.3 2.96-128)

Use the path returned above (remove specs and replace with include)

sys_include=($ORACLE_HOME/precomp/public,
             /usr/lib/gcc-lib/i386-redhat-linux7/2.96/include, 
             /usr/include)

include=(/u02/app/oracle/product/8.1.5/precomp/public)
include=(/u02/app/oracle/product/8.1.5/rdbms/demo)
include=(/u02/app/oracle/product/8.1.5/network/public)
include=(/u02/app/oracle/product/8.1.5/plsql/public)

I am guessing that the part of having both sysinclude and include is your issue.


You have to make sure that the include search path is setup such that all needed directories are included in the right order by Pro*C.

For example on CentOS 6.5 I specify following order (in the pcscfg.cf):

sys_include=$ORACLE_HOME/sdk/include
sys_include=/usr/include
sys_include=/usr/lib/gcc/x86_64-redhat-linux/4.4.7/include
sys_include=/usr/include/linux
ltype=short
define=__x86_64__

This configuration file is read by proc from $ORACLE_HOME/precomp/admin/pcscfg.cfg.

Apparently, the default file written by the Oracle installer is often suboptimal, because it e.g. lists a non-existing GCC path and/or uses a problematic include path order.

With a different order I get the same size_t related error messages (when permuting the first 4 lines to (1,2,4,3) ).

When permuting the first 4 lines to (1,3,2,4) and including <limits.h>, proc even goes into an memory allocating infinite loop until it is killed by the OOM killer.

As a workaround you can also specify the sys_include option on the proc command line, e.g:

lines=yes \
code=ANSI_C \
sqlcheck=full \
parse=full \
sys_include=$(ORACLE_HOME)/precomp/public \
sys_include=/usr/include \
sys_include=/usr/lib/gcc/x86_64-redhat-linux/4.4.7/include \
sys_include=/usr/include/linux