9

我正在使用 Oracle 10.2 和 AIX 5.2 预编译包含 Pro*C 代码的 C 程序

Oracle 预编译器读取$ORACLE_HOME/precomp/admin/pcscfg.cfg file包含 sys_include 变量定义的 (设置为/usr/include)。

Pro*C 编译器抱怨它不知道size_t类型是什么,并且使用该类型的 Oracle 头文件size_t正在报告错误。

这是文件上报告的示例错误sqlcpr.h

extern void sqlglm( char*, size_t*, size_t* );
...........................1
PCC-S-02201, Encountered the symbol "size_t" when expecting one of the following

size_tstdio.h在目录的头文件中定义/usr/include。在包含标题之前,我将标题包含stdio.h在我的文件中。example.pcsqlcpr.h

我发出 proc 命令如下:

proc iname=example parse=full

任何想法我做错了什么?

4

8 回答 8

9

来自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 *);

解决方案说明

'sys_include' 和 'include' 预编译器选项设置不正确。 在位于 $ORACLE_HOME/precomp/admin 的 pcscfg.cfg 文件中设置“sys_include”和“include”预编译器选项,或者在调用“proc”时在命令行中包含。

例如,以下是正确设置变量的推荐方法:

运行以下命令以获取编译器位置:

gcc -v

从 /usr/lib/gcc-lib/i386-redhat-linux7/2.96/specs 读取规范 gcc 版本 2.96 20000731 (Red Hat Linux 7.3 2.96-128)

使用上面返回的路径(删除规范并替换为包含)

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)

我猜想同时拥有 sysinclude 和 include 是你的问题。

于 2008-11-28T16:33:16.463 回答
4

您必须确保设置了包含搜索路径,以便 Pro*C 以正确的顺序包含所有需要的目录。

例如,在 CentOS 6.5 上,我指定以下顺序(在 中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__

此配置文件由procfrom读取$ORACLE_HOME/precomp/admin/pcscfg.cfg

显然,Oracle 安装程序编写的默认文件通常不是最理想的,因为它例如列出了不存在的 GCC 路径和/或使用有问题的包含路径顺序。

使用不同的顺序,我会收到相同的size_t相关错误消息(将前 4 行排列为 (1,2,4,3) 时)。

当将前 4 行置换为 (1,3,2,4) 并包括<limits.h>时,proc甚至会进入内存分配无限循环,直到它被 OOM 杀手杀死。

作为一种解决方法,您还可以sys_include在命令行上指定选项proc,例如:

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
于 2013-05-01T19:22:30.683 回答
1

当我玩我的 pcscfg.cfg 文件时,有两件事值得注意。

1 请记住它不支持“空格”,因此任何包含空格的路径都应以“短”样式书写。例如:SYS_INCLUDE=D:\Progra~1\Micros~1.0\VC\include 您可以在 Windows 中使用 dir /x 来获取名称的简短版本

2 至少在我看来,INCLUDE 应该写在所有这些选项之前。即如果

define=(WIN32_LEAN_AND_MEAN)
parse=full
SYS_INCLUDE=D:\Progra~1\Micros~1.0\VC\include

不行,试试

define=(WIN32_LEAN_AND_MEAN)
SYS_INCLUDE=D:\Progra~1\Micros~1.0\VC\include
parse=full

反而。

于 2012-12-25T09:21:32.960 回答
1

我遇到了类似的问题(“PCC-S-02201,遇到符号 ...”)。我听了上面的两条建议。

  • 检查sys_include并确保目录路径是编译器实际设置使用的目录路径。Pro*C 使用的默认值通常不存在。编译一个“Hello World”程序gcc -v -c <prog.c>并检查COMPILER_PATH
  • 我调整了选项sys_include的顺序并按顺序提出(不确定是否重要,但仍然如此。)

所以 PCC-S-02201 消失了。

于 2013-05-07T06:15:30.913 回答
0

我修改了将 /usr/include/linux 放在其他所有内容之前。这清除了找不到 stddef.h 和不知道 size_t 是什么的问题。将它放在 /usr/include 旁边只能修复前者。

修改后的 pcscfg.cfg:

sys_include=( /usr/include/linux, $ORACLE_HOME/precomp/public,/usr/include,/usr/lib/gcc/i386-redhat-linux/4.1.1/include,/usr/lib/gcc/i386- redhat-linux/3.4.5/include,/usr/lib/gcc-lib/i386-redhat-linux/3.2.3/include,/usr/lib/gcc/i586-suse-linux/4.1.2/include, /usr/lib/gcc/i586-suse-linux/4.3/include) ltype=short

(CentOS 6.3, oracle 11g)

于 2014-02-06T04:42:30.560 回答
0

将 sys_include 用于包含环境变量或 Visual Studio 变量的路径。如果路径是简单路径,使用“include”,否则使用“sys_include”

我在 Visual Studio 2013 上遇到了这个问题,用于编译 .pc 文件,通过上述更改,一切正常。

于 2014-11-24T22:44:47.303 回答
0

添加一个编译标志行以pcscfg.cfg使Oracle的预编译器编译没有系统头文件语法错误:

define=_POSIX_C_SOURCE

就是这样。它现在应该没有错误地进行预编译。

于 2017-02-01T20:21:13.713 回答
0

我遇到过同样的问题:

[me@somesys:~/proC]$ proc sys_include='(/usr/include,/usr/include/linux,/usr/include/c++/4.8.2/x86_64-redhat-linux,/usr/include/c++/4.8.2/tr1,/usr/include/c++/4.8.2)' copy.pc

Pro*C/C++: Release 12.1.0.2.0 - Production on Thu Jun 6 17:47:11 2019

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

System default option values taken from: /oracle/app/oracle/product/12.1.0.2/precomp/admin/pcscfg.cfg

Syntax error at line 307, column 3, file /usr/include/libio.h:
Error at line 307, column 3 in file /usr/include/libio.h
  size_t __pad5;
..1
PCC-S-02201, Encountered the symbol "size_t" when expecting one of the following
:

   } char, const, double, enum, float, int, long, ulong_varchar,
   OCIBFileLocator OCIBlobLocator, OCIClobLocator, OCIDateTime,
   OCIExtProcContext, OCIInterval, OCIRowid, OCIDate, OCINumber,
...

我按照 yogmk 的建议做了:

[me@somesys:~/proC]$ gcc -v -c borrame.c
Using built-in specs.
COLLECT_GCC=gcc
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
COLLECT_GCC_OPTIONS='-v' '-c' '-mtune=generic' '-march=x86-64'
 /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/cc1 -quiet -v borrame.c -quiet -dumpbase borrame.c -mtune=generic -march=x86-64 -auxbase borrame -version -o /tmp/cc2WTuu6.s
GNU C (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-36) (x86_64-redhat-linux)
        compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-36), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../x86_64-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include
 /usr/local/include
 /usr/include
End of search list.
GNU C (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-36) (x86_64-redhat-linux)
...

但是COMPILER_PATH,我按顺序复制了 之后的非空目录#include <...> search starts here:,而不是 ,它起作用了!

[me@somesys:~/proC]$ proc sys_include='(/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include,/usr/include)' copy.pc

Pro*C/C++: Release 12.1.0.2.0 - Production on Thu Jun 6 17:54:50 2019

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

System default option values taken from: /oracle/app/oracle/product/12.1.0.2/precomp/admin/pcscfg.cfg

[me@somesys:~/proC]$

希望它可以帮助任何人。

于 2019-06-06T23:02:35.667 回答