9 Stimmen

ORACLE 10.2 Pro*C Precompiler liest keine Header-Datei

Ich kompiliere ein C-Programm, das Pro*C-Code enthält, mit Oracle 10.2 und AIX 5.2

Der Oracle-Precompiler liest die $ORACLE_HOME/precomp/admin/pcscfg.cfg file die die Definition der sys_include-Variable enthält (gesetzt auf /usr/include ).

Der Pro*C-Compiler beschwert sich, dass er nicht weiß, was der size_t Typ ist und die Oracle-Header-Dateien, die den size_t Typs sind Fehler zu melden.

Hier ist ein Beispiel für einen Fehler, der auf der sqlcpr.h Datei:

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

size_t ist definiert in der stdio.h Header-Datei in der /usr/include Verzeichnis. Ich füge die stdio.h Kopfzeile in meinem example.pc Datei, bevor ich die sqlcpr.h Kopfzeile.

Ich gebe den proc-Befehl wie folgt aus:

proc iname=example parse=full

Irgendwelche Ideen, was ich falsch mache?

9voto

EvilTeach Punkte 27313

Von 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 *);

Beschreibung der Lösung

Die Precompiler-Optionen 'sys_include' und 'include' sind nicht gesetzt korrekt gesetzt. Setzen der Precompiler-Optionen 'sys_include' und 'include' in der Datei pcscfg.cfg unter $ORACLE_HOME/precomp/admin oder include in der Befehlszeile beim Aufruf von 'proc'.

Zum Beispiel wird hier empfohlen, die Variable richtig zu setzen:

Führen Sie den folgenden Befehl aus, um den Speicherort des Compilers zu ermitteln:

gcc -v

Lesen von Spezifikationen aus /usr/lib/gcc-lib/i386-redhat-linux7/2.96/specs gcc Version 2.96 20000731 (Red Hat Linux 7.3 2.96-128)

Verwenden Sie den oben angegebenen Pfad (entfernen Sie specs und ersetzen Sie durch include)

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)

Ich vermute, dass der Teil, der sowohl sysinclude als auch include enthält, Ihr Problem ist.

4voto

maxschlepzig Punkte 31061

Sie müssen sicherstellen, dass der Include-Suchpfad so eingerichtet ist, dass alle benötigten Verzeichnisse in der richtigen Reihenfolge von Pro*C aufgenommen werden.

Auf CentOS 6.5 gebe ich zum Beispiel folgende Reihenfolge an (in der 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__

Diese Konfigurationsdatei wird gelesen von proc de $ORACLE_HOME/precomp/admin/pcscfg.cfg .

Offenbar ist die vom Oracle-Installationsprogramm geschriebene Standarddatei oft suboptimal, weil sie z.B. einen nicht existierenden GCC-Pfad auflistet und/oder eine problematische Include-Pfad-Reihenfolge verwendet.

Bei einer anderen Bestellung erhalte ich das gleiche size_t bezogene Fehlermeldungen (wenn die ersten 4 Zeilen in (1,2,4,3) umgewandelt werden).

Wenn man die ersten 4 Zeilen in (1,3,2,4) umwandelt und die <limits.h> , proc geht sogar in eine speichervergebende Endlosschleife, bis sie vom OOM-Killer beendet wird.

Als Abhilfe können Sie auch die Option sys_include Option auf der proc Befehlszeile, z.B:

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

1voto

AERYEN Punkte 21

Zwei Dinge sind erwähnenswert, wenn ich mit meiner pcscfg.cfg-Datei spiele.

1 Denken Sie daran, dass es kein "Leerzeichen" unterstützt, so dass jeder Pfad, der ein Leerzeichen enthält, im "kurzen" Stil geschrieben werden sollte. z.B.: SYS_INCLUDE=D:\Progra~1\Micros~1.0\VC\include Sie können dir /x in Windows verwenden, um die Kurzversion der Namen zu erhalten

2 Es scheint, zumindest in meinem Fall, dass INCLUDE vor all diesen Optionen geschrieben werden sollte. D.h. Wenn

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

nicht funktioniert, versuchen Sie

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

Stattdessen.

1voto

yogmk Punkte 151

Ich hatte ein ähnliches Problem ("PCC-S-02201, Encountered the symbol ..."). Ich habe beide oben genannten Ratschläge befolgt.

  • Prüfen Sie die sys_include und stellen Sie sicher, dass der Verzeichnispfad derjenige ist, den der Compiler tatsächlich verwenden soll. Die von Pro*C verwendeten Voreinstellungen existieren in der Regel nicht. Kompilieren Sie ein 'Hello World'-Programm mit gcc -v -c <prog.c> und prüfen COMPILER_PATH
  • Ich habe die Reihenfolge der Optionen angepasst und die sys_include in der Reihenfolge nach oben (ich bin mir nicht sicher, ob das wichtig ist, aber trotzdem).

Die PCC-S-02201 ist also weg.

1voto

Ben Abarbanel Punkte 1

Fügen Sie eine Kompilier-Flag-Zeile zu pcscfg.cfg damit der Oracle-Precompiler ohne Syntaxfehler in den Systemheader-Dateien kompiliert:

define=_POSIX_C_SOURCE

Das war's. Es sollte jetzt ohne Fehler vorkompiliert werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X