Oracle Pro*C 预编译:文件 /usr/include/sys/cdefs.h PCC-S-02014 第 166 行第 45 列存在语法错误

问题描述 投票:0回答:6

我正在准备一台新的 Oracle Linux 8.6 机器,只有一个 Oracle Client 19c 客户端,它还应该编译一些 Pro*C 代码,但是当尝试编译简单的 proc 代码时,例如

#include <stdio.h>
int main(int argc, char** argv){
printf("Stefan's Hello world!");
return(0);
}

我收到如下错误:

$ proc iname=mytest.pc

Pro*C/C++: Release 19.0.0.0.0 - Production on Wed Nov 16 14:32:43 2022
Version 19.3.0.0.0

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

System default option values taken from: /u01/app/oracle/product/19c/dbhome_1/precomp/admin/pcscfg.cfg

Syntax error at line 166, column 45, file /usr/include/sys/cdefs.h:
Error at line 166, column 45 in file /usr/include/sys/cdefs.h
#define __glibc_fortify(f, __l, __s, __osz, ...) \
............................................1
PCC-S-02014, Encountered the symbol "..." when expecting one of the following:

   an identifier, define, elif, else, endif, error, if, ifdef,
   ifndef, include, include_next, line, pragma, undef, exec,
   sql, begin, end, var, type, oracle,
   an immediate preprocessor command, a C token, create,
   function, package, procedure, trigger, or, replace,

Syntax error at line 168, column 9, file /usr/include/sys/cdefs.h:
Error at line 168, column 9 in file /usr/include/sys/cdefs.h
   ? __ ## f ## _alias (__VA_ARGS__)                                          \
........1
PCC-S-02014, Encountered the symbol "##" when expecting one of the following:

   ; { } , = : ( ) [ ] * ? | & < > + - / % ~ ! . # @ ^ *= /= %=
   += -= <<= >>= &&= ||= ^= ~= := | & == != <= >= << >> ++ -- ->
   ... .. <> ** => an identifier, a string, a numeric constant,
   a sql string, misc. punctuation, newline, define, elif, else,
   endif, error, if, ifdef, ifndef, include, include_next, line,
   pragma, undef, exec, sql, begin, end, var, type, oracle,
   an immediate preprocessor command, a C token, exec sql,
   exec sql include, exec sql var, exec sql begin, exec sql end,
   end-exec, exec sql type, exec oracle, exec oracle else,
   exec oracle endif, exec oracle begin, a sql hint, create,
   function, package, procedure, trigger, or, replace,
   a C++ token,

我认为与库配置中的某些错误有关,但我不明白是什么。

奇怪的是,我准备了一个具有相同软件包的全新虚拟机并且正在运行(我记录了所有步骤并在另一台计算机上复制)。

/u01/app/oracle/product/19c/dbhome_1/precomp/admin/pcscfg.cfg 的内容是

sys_include=($ORACLE_HOME/precomp/public,/usr/include,/usr/lib/gcc/x86_64-redhat-linux/8/include)
ltype=short
define=__x86_64__
define=_MATH_H

有什么想法吗?

oracle proc
6个回答
2
投票

正如我在已删除的帖子中提到的,我们在 redhat 8 环境中也遇到了同样的问题。我们最终通过降级环境中的 glibc-headers 来克服这个问题。 我们目前正在向 Oracle 立案,并在 RedHat 立案,因为他们会自动互相指责。 希望这有帮助。


1
投票

gcc(和其他编译器)具有 Pro*C 未知的非标准扩展和独特功能

对我有用的解决方案是为 Pro*C 创建虚拟头文件。这些文件应该有最少的内容甚至没有内容,足以进行预编译。

现在我创建了一个 github 存储库,你可能想尝试一下:https://github.com/lzsiga/proc_include


0
投票

使用 oracle 补丁 34765931 问题已得到解决。


0
投票

对我有用的是将 $ORACLE_HOME/precomp/admin/pcscfg.cfg 中的“parse”选项更改为(或添加,如果不存在)“partial” - 它将使用更宽松的 C 解析,因此 Pro*C 会忽略它不理解 C 语法。

此解决方案来自https://stackoverflow.com/a/2468655/2356843

我发现该解决方案适用于 19.3 和 21.3 客户端(或其中包含的 pro*C 预编译器)。

此外,选项名称似乎不区分大小写。 “解析”或“解析”都有效。


0
投票

自从我第一次从 12c 升级到 19c 以来,这个问题就一直困扰着我,之前我唯一能找到的解决方案就是上面提到的降级 glibc 方法。但我最近再次升级,找不到可行的组合。搜索我发现了这篇文章和 Lorinxzy 的出色解决方案。我本来打算尝试一下,但在这个过程中,我再次查看了我的 pc 文件,并意识到我根本不需要标准 C 包含文件。我使用 gSoap 构建了一个 Web 服务应用程序,并将所有 Oracle 调用放在 pc 文件中。我有一个单独的 C 文件用于其他代码。从 pc 文件中删除包含内容有效,预处理器运行没有问题。因此,如果您能够以这种方式组织代码,就可以避免此预处理器问题。


-2
投票

我发现的解决此问题的唯一方法是更新到 OIC-21.8

我讨厌甲骨文。但话又说回来,我讨厌大多数数据库。 没有完美的数据库,但有些数据库比其他数据库更糟糕

© www.soinside.com 2019 - 2024. All rights reserved.