2017-09-04 72 views
1

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 

我也尝试了各种重新排序,切换includesys_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似乎没有被正确地处理该系统的编译器头。任何想法为什么或甚至进一步尝试帮助诊断潜在原因?

+0

有完全相同的问题。用gcc 4.8.2和7.3.0试过你的解决方案。仍然没有运气。 –

+0

如果使用与服务器不同版本的客户端,请考虑将common_parser = yes选项添加到您的proc命令。我认为这是让我进一步发展的一件事,但即使在oracle客户端和服务器版本相同的情况下,我仍然无法使其工作。 –

回答

1

我已经能够让我的应用程序正确编译,我发现即使通过将命令“gcc -dM -E-</dev/null”的输出添加到头文件中解决了一些编译问题并将其包含在每个Pro * C源文件中,因此引入了新的编译问题,并尝试再次解决这些新问题以引入其他方法,从而使方法无法实现。

最后我再次从头开始,只包含那些proc编译器所需的#defines。此外,我不得不重新安排在proc配置文件$ {ORACLE_HOME}的路径/precomp/admin/pcscfg.cfg

这是它看起来像现在:

sys_include=$ORACLE_HOME/precomp/public 
sys_include=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include 
sys_include=/usr/local/include 
sys_include=/usr/include 
sys_include=/usr/include/linux 
ltype=short 
define=__x86_64__ 

这样做的原因gcc include目录中有几个文件也存在于其他一些目录中,但是这些文件假定所有这些gcc内部定义都被设置。系统包含位于gcc include目录下的文件,有时与下面列出的通常包含目录中的文件有很大不同,看起来proc在解析位于gcc 4.8.5目录中的文件时有很多缺陷。

接下来这一点,包括文件,我创建并进入的#include每个源文件PROC哽咽现在看起来这样的:

#ifndef __GCC4_INTERNAL_DEFINES_H__ 
#define __GCC4_INTERNAL_DEFINES_H__ 

/* Proceed only when using the Oracle Pro*C compiler on RHEL7 */ 
#ifdef DB_PRE_COMP 
#ifdef OS_IS_RHEL7 

/* These are some of the defines that gcc4 sets by itself. The Pro*C precompiler 
    does not know them and they are needed in order to correctly parse several 
    system header files. Full list of gcc4 internal defines may be obtained with 
    the following command: gcc -dM -E - < /dev/null */ 
#define __INT_LEAST8_TYPE__ signed char 
#define __INT_LEAST16_TYPE__ short int 
#define __INT_LEAST32_TYPE__ int 
#define __INT_LEAST64_TYPE__ long int 
#define __UINT_LEAST8_TYPE__ unsigned char 
#define __UINT_LEAST16_TYPE__ short unsigned int 
#define __UINT_LEAST32_TYPE__ unsigned int 
#define __UINT_LEAST64_TYPE__ long unsigned int 
#define __INT_FAST8_TYPE__ signed char 
#define __INT_FAST16_TYPE__ long int 
#define __INT_FAST32_TYPE__ long int 
#define __INT_FAST64_TYPE__ long int 
#define __UINT_FAST8_TYPE__ unsigned char 
#define __UINT_FAST16_TYPE__ long unsigned int 
#define __UINT_FAST32_TYPE__ long unsigned int 
#define __UINT_FAST64_TYPE__ long unsigned int 
#define __INTMAX_TYPE__ long int 
#define __UINTMAX_TYPE__ long unsigned int 

#include </usr/include/stdint.h> 

#endif /* OS_IS_RHEL7 */ 
#endif /* DB_PRE_COMP */ 

#endif /* __GCC4_INTERNAL_DEFINES_H__ */ 

出乎我的救济,我把一切都与这些更新重新编译。为了完整起见,proc使用parse = full选项来执行,这也是我以前在RHEL6下做的以及我的应用程序显然需要的;作为我努力让它编译的一部分,我尝试了部分选项,但这并没有什么不同,它仍然窒息。

相关问题