Прекомпилятор ORACLE 10.2 Pro * C не читает заголовочный файл - PullRequest
7 голосов
/ 28 ноября 2008

Я предварительно компилирую программу на C, содержащую код Pro * 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_t определяется в заголовочном файле stdio.h в каталоге /usr/include. Я включаю заголовок stdio.h в свой файл example.pc, прежде чем включить заголовок sqlcpr.h.

Я выдаю команду proc следующим образом:

proc iname=example parse=full

Есть идеи, что я делаю не так?

Ответы [ 8 ]

8 голосов
/ 28 ноября 2008

От Металинк

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' не установлены правильно. Установите параметры прекомпилятора 'sys_include' и 'include' в файле pcscfg.cfg, расположенном в $ ORACLE_HOME / precomp / admin или включить в командную строку при вызове '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)

Использовать путь, указанный выше (удалить спецификации и заменить на 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)

Я предполагаю, что ваша проблема состоит в том, чтобы включить и sysinclude, и include.

4 голосов
/ 01 мая 2013

Вы должны убедиться, что путь поиска включения настроен таким образом, чтобы 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
1 голос
/ 25 декабря 2012

Стоит отметить две вещи, когда я играю со своим файлом pcscfg.cfg.

1 Помните, что он не поддерживает «пробел», поэтому любой путь, включая пробел, должен быть написан в «коротком» стиле. например: SYS_INCLUDE=D:\Progra~1\Micros~1.0\VC\include Вы можете использовать dir / x в Windows, чтобы получить краткую версию имен

2 Похоже, в моем случае, по крайней мере, INCLUDE должен быть написан перед всеми этими опциями. И.Е. Если

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

Вместо.

0 голосов
/ 07 июня 2019

У меня была такая же проблема:

[me@somesys:~/proC]$ proc sys_include='(/usr/include,/usr/include/linux,/usr/include/c++/4.8.2/x86_64-redhat-linux,/usr/include/c++/4.8.2/tr1,/usr/include/c++/4.8.2)' copy.pc

Pro*C/C++: Release 12.1.0.2.0 - Production on Thu Jun 6 17:47:11 2019

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

System default option values taken from: /oracle/app/oracle/product/12.1.0.2/precomp/admin/pcscfg.cfg

Syntax error at line 307, column 3, file /usr/include/libio.h:
Error at line 307, column 3 in file /usr/include/libio.h
  size_t __pad5;
..1
PCC-S-02201, Encountered the symbol "size_t" when expecting one of the following
:

   } char, const, double, enum, float, int, long, ulong_varchar,
   OCIBFileLocator OCIBlobLocator, OCIClobLocator, OCIDateTime,
   OCIExtProcContext, OCIInterval, OCIRowid, OCIDate, OCINumber,
...

И я сделал так, как предложил йогмк:

[me@somesys:~/proC]$ gcc -v -c borrame.c
Using built-in specs.
COLLECT_GCC=gcc
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
COLLECT_GCC_OPTIONS='-v' '-c' '-mtune=generic' '-march=x86-64'
 /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/cc1 -quiet -v borrame.c -quiet -dumpbase borrame.c -mtune=generic -march=x86-64 -auxbase borrame -version -o /tmp/cc2WTuu6.s
GNU C (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-36) (x86_64-redhat-linux)
        compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-36), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../x86_64-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include
 /usr/local/include
 /usr/include
End of search list.
GNU C (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-36) (x86_64-redhat-linux)
...

Но вместо COMPILER_PATH я скопировал по порядку непустые каталоги после #include <...> search starts here:, и это сработало!

[me@somesys:~/proC]$ proc sys_include='(/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include,/usr/include)' copy.pc

Pro*C/C++: Release 12.1.0.2.0 - Production on Thu Jun 6 17:54:50 2019

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

System default option values taken from: /oracle/app/oracle/product/12.1.0.2/precomp/admin/pcscfg.cfg

[me@somesys:~/proC]$

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 01 февраля 2017

Добавьте одну строку флага компиляции в pcscfg.cfg, чтобы прекомпилятор Oracle компилировался без ошибок синтаксиса файла заголовка системы:

define=_POSIX_C_SOURCE

Вот и все. Теперь он должен прекомпилироваться без ошибок.

0 голосов
/ 25 ноября 2014

Используйте sys_include для пути, содержащего переменные среды или переменные Visual Studio. Если путь является простым путем, используйте «include», иначе используйте «sys_include»

У меня есть эта проблема в Visual Studio 2013, для компиляции файлов .pc, с вышеуказанным изменением, все заработало.

0 голосов
/ 06 февраля 2014

Я изменил размещение / usr / include / linux перед всем остальным. Это устраняло как невозможность найти stddef.h, так и не зная, что такое size_t. Размещение его рядом с / usr / include только исправило прежнее.

Модифицированный pcscfg.cfg:

sys_include = ( / USR / включать / Linux, $ ORACLE_HOME / Предкомпенсация / общественности, / USR / включать / USR / Библиотека / GCC / i386-RedHat-линукс / 4.1.1 / включить, /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 / включают, / USR / Библиотека / GCC / i586-SUSE-Linux / 4.3 / включить) LTYPE = короткий

(CentOS 6.3, oracle 11g)

0 голосов
/ 07 мая 2013

У меня была похожая проблема («PCC-S-02201, Обнаружен символ ...»). Я выслушал оба совета выше.

  • Проверьте sys_include и убедитесь, что путь к каталогу является тем, который на самом деле установлен компилятором. Стандартные настройки, используемые Pro * C, обычно не существуют. Скомпилируйте программу Hello World с помощью gcc -v -c <prog.c> и отметьте COMPILER_PATH
  • Я изменил порядок опций и привел sys_include в порядок (не совсем уверен, должно ли это иметь значение, но все же)

поэтому PCC-S-02201 ушел.

...