Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ORACLE 10.2 Pro*C precompiler not reading header file

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?

like image 919
David Avatar asked Nov 28 '08 13:11

David


4 Answers

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.

like image 108
EvilTeach Avatar answered Oct 18 '22 16:10

EvilTeach


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
like image 25
maxschlepzig Avatar answered Oct 18 '22 16:10

maxschlepzig


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.

like image 25
AERYEN Avatar answered Oct 18 '22 18:10

AERYEN


I had the similar issue ("PCC-S-02201, Encountered the symbol ..."). I listened to both pieces of advice above.

  • Check the 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
  • I adjusted the order of options and brought sys_include up in the order (not really sure if should matter, but still.)

so the PCC-S-02201 went away.

like image 1
yogmk Avatar answered Oct 18 '22 16:10

yogmk