Ошибки предварительной компиляции Oracle Pro * C для инструкций EXEC SQL во включенных файлах

#oracle #oracle-pro-c

#Oracle #oracle-pro-c

Вопрос:

Я конвертирую некоторый устаревший код в Oracle Pro * C. Я нахожусь в Linux, используя Oracle 11.2. Мы используем «.cp» в качестве суффикса для исходных файлов Pro * C. Я не очень разбираюсь в C-разработчике, поэтому я как бы блуждаю в темноте, когда иду.

В какой-то момент у меня есть некоторый код в файле общей библиотеки «assign_field.cp», поэтому в myprog.cp я делаю

 EXEC SQL INCLUDE "assign_field.cp";
  

Теперь в assign_field.cp у меня есть очень распространенная строка кода Pro * C…

 EXEC SQL INCLUDE SQLCA;
  

Для этой строки, наряду со многими другими, я вижу следующий вывод компилятора:

 assign_field.cp:35: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before âSQLâ
  

Похоже, что компилятор не распознает, что это код Pro * C.

У меня есть другие включаемые файлы, которые очень похожи на assign_field.cp, но которые, похоже, отлично компилируются при включении.

Комментарии:

1. Я не понимаю вашего описания того, что вы делаете. Если assign_field.cp это исходный файл, который является частью общей библиотеки, почему вы пытаетесь включить его в (как я полагаю) ваш исполняемый файл? Конечно, вы должны ссылаться на библиотеку позже? Я бы ожидал, что каждый .cp файл будет компилироваться в свой собственный .o файл, а также для того, чтобы они были связаны с библиотеками или исполняемыми файлами в зависимости от обстоятельств. Если это обычное явление, а не действительно библиотечный код, тогда это может иметь смысл и потребовать exec sql . Не уверен, что я что-то упускаю — тоже не эксперт по C… Кроме того, вы унаследовали makefile?

2. Я унаследовал makefile. (упс, слишком рано нажал enter) У меня нет файлов .h для файлов .cp, которые выглядят так, как будто их нужно включить, поэтому я просто включал файлы .cp напрямую в исходный файл.

3. Создает ли ваш makefile библиотеку, а затем связывает с ней exe-файл; или создает отдельные .o s для .cp s и связывает несколько с exe-файлом; или это assign_field вообще не упоминается? Все еще не совсем уверен … myprog.cp вызывает функции, которые находятся внутри assign_field.cp , но не имеют для них (внешних) объявлений, которые вы ожидали увидеть в связанных .h ?

4. В makefile явно не упоминается assign_field вообще. Работа makefile осложняется наличием инструкций прекомпилятора Oracle Pro * C. myprog.cp вызывает функции, которые находятся в файле assign_field.cp, и для них нет объявлений extern.

Ответ №1:

Не включайте файлы C (в данном случае файлы .cp) в поток программы. Скомпилируйте их отдельно; обратитесь только к объявлению функции, например, во включенном файле .h. Обратитесь к скомпилированным объектным файлам (возможно, .o) при вызове компоновщика в makefile.