9

Pro*C コードを含む C プログラムを Oracle 10.2 および AIX 5.2 でプリコンパイルしています。

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

メタリンクから

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__

この構成ファイルは によって読み取られprocます$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 ファイルをいじる際に注意すべき点が 2 つあります。

1 「スペース」をサポートしていないため、スペースを含むパスは「短い」スタイルで記述する必要があることに注意してください。例: SYS_INCLUDE=D:\Progra~1\Micros~1.0\VC\include Windows で dir /x を使用して、短いバージョンの名前を取得できます。

2 少なくとも私の場合、INCLUDE はこれらすべてのオプションの前に記述する必要があるようです。IE If

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、オラクル 11g)

于 2014-02-06T04:42:30.560 に答える
0

環境変数または Visual Studio 変数を含むパスには sys_include を使用します。パスが単純なパスの場合は「include」を使用し、それ以外の場合は「sys_include」を使用します

上記の変更により、.pcファイルをコンパイルするためにVisual Studio 2013でこの問題が発生し、すべてが機能しました。

于 2014-11-24T22:44:47.303 に答える