TLDR:在CentOS 7.3上从Oracle即时客户端12.2运行ProC似乎无法正确处理一个简单的输入文件。ProC抱怨Linux上的未定义符号(CentOS 7.3)
最小输入文件证明的问题:
EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL INCLUDE oci.h;
EXEC SQL END DECLARE SECTION;
真正的文件显然包括我自己的项目的头,但最终他们拉在oci.h
,这是即时客户端SDK头之一,这似乎成为构建问题的来源。
调用进程内:
下面的脚本演示该问题(再次,真正的情况简化版本):
#!/bin/sh
export ORACLE_HOME=/some/path/instantclient_12_2
export ORACLE_SID=SomeSID
export PATH=/various/paths:${ORACLE_HOME}:${ORACLE_HOME}/sdk:${ORACLE_HOME}/bin:/some/more/paths/like:usr/bin:
export LD_LIBRARY_PATH=${ORACLE_HOME}:${ORACLE_HOME}/lib32:${ORACLE_HOME}/lib
${ORACLE_HOME}/sdk/proc \
LTYPE=LONG \
PARSE=PARTIAL \
MODE=ORACLE \
CODE=ANSI_C \
iname=foo.pc
Oracle配置:
我的pcscfg.cfg
文件的内容如下所示:
sys_include=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include
sys_include=/usr/include
include=/some/path/instantclient_12_2/sdk/include
我也尝试了各种重新排序,切换include
和sys_include
,但似乎都给出了相同的行为。如在各种在线参考文献中所见,添加define=__x86_64__
没有区别。我已经选择在上面扩大$ORACLE_PATH
以使示例更清楚。
样品误差输出:
使用在上述输出结果来定义与像错误输入文件中的以下(截断为有助于集中的讨论):
Pro*C/C++: Release 12.2.0.1.0 - Production on Mon Sep 4 16:19:45 2017
Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
System default option values taken from: /some/path/instantclient_12_2/precomp/admin/pcscfg.cfg
Syntax error at line 46, column 1, file /usr/include/bits/byteswap-16.h:
Error at line 46, column 1 in file /usr/include/bits/byteswap-16.h
{
1
PCC-S-02201, Encountered the symbol "{" when expecting one of the following:
; , = ([
绕直线的内容它抱怨是这样的:
static __inline unsigned short int
__bswap_16 (unsigned short int __bsx)
{ // <---- this is line 46
return __bswap_constant_16 (__bsx);
}
如果余吨前插入#include <stdlib.h>
他EXEC SQL BEGIN DECLARE SECTION
线,该错误信息更改为这样的:因为我已经通过逻辑更仔细的追踪,甚至迫使size_t
到通过各种方式来定义
Syntax error at line 265, column 50, file /some/path/instantclient_12_2/sdk/include/ociextp.h:
Error at line 265, column 50 in file /some/path/instantclient_12_2/sdk/include/ociextp.h
void *ociepacm(OCIExtProcContext *with_context, size_t amount);
.................................................1
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.
这一个是更有趣的,我仍然得到上述错误。但是,如果我将ProC调用更改为使用PARSE=FULL
,则它会成功。不幸的是,这会导致真正的代码出现其他问题,并且这些问题与这个问题具有类似的性质(即编译器头文件中的扼流器实际上应该由编译器头文件定义)。
进一步意见:
在不同的解决方案,展望网上,这些问题通常是已经错误地设置包括搜索路径的结果,但我已经从输出列出确实被人发现正确的头验证。好像有一些编译器定义缺少,GCC通常会提供,但ProC不提供。有很多其他相关的例子支持这个理论,给出了诸如__INT_LEAST8_TYPE__
之类的东西的错误是不知道的(就我可以告诉GCC内部而不是明确地在其任何头文件中定义)。
具体问题:
使用ProC似乎没有被正确地处理该系统的编译器头。任何想法为什么或甚至进一步尝试帮助诊断潜在原因?
有完全相同的问题。用gcc 4.8.2和7.3.0试过你的解决方案。仍然没有运气。 –
如果使用与服务器不同版本的客户端,请考虑将common_parser = yes选项添加到您的proc命令。我认为这是让我进一步发展的一件事,但即使在oracle客户端和服务器版本相同的情况下,我仍然无法使其工作。 –