I'm pre-compiling a C program containing Pro*C code with Oracle 10.2 and AIX 5.2
The Oracle precompiler reads the $ORACLE_HOME/precomp/admin/pcscfg.cfg file
which contains the definition of the sys_include variable (set to /usr/include
).
The Pro*C compiler complains that it doesn't know what the size_t
type is and the Oracle header files that use the size_t
type are reporting errors.
Here's an example error being reported on the sqlcpr.h
file:
extern void sqlglm( char*, size_t*, size_t* );
...........................1
PCC-S-02201, Encountered the symbol "size_t" when expecting one of the following
size_t
is defined in the stdio.h
header file in the /usr/include
directory. I'm including the stdio.h
header in my example.pc
file before I include the sqlcpr.h
header.
I'm issuing the proc command as follows:
proc iname=example parse=full
Any ideas what I'm doing wrong?
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
Two thing worth noting when I playing with my pcscfg.cfg file.
1 Remember it doesn't support "space", so any path including space should be written in "short" style. e.g.: SYS_INCLUDE=D:\Progra~1\Micros~1.0\VC\include
You can use dir /x in windows to get the short version of the names
2 It appears, in my case at least, INCLUDE should be written before all those options stuff. I.E. If
define=(WIN32_LEAN_AND_MEAN)
parse=full
SYS_INCLUDE=D:\Progra~1\Micros~1.0\VC\include
doesn't work, try
define=(WIN32_LEAN_AND_MEAN)
SYS_INCLUDE=D:\Progra~1\Micros~1.0\VC\include
parse=full
Instead.
I had the similar issue ("PCC-S-02201, Encountered the symbol ..."). I listened to both pieces of advice above.
sys_include
and make sure the directory path is the one that compiler is actually is set to use. Defaults used by Pro*C generally do not exist. Compile a 'Hello World' program with gcc -v -c <prog.c>
and check COMPILER_PATH
sys_include
up in the order (not really sure if should matter, but still.)so the PCC-S-02201 went away.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With