Точка входа GnuCOBOL не найдена

Я установил GnuCOBOL 2.2 в моей системе Ubuntu 17.04. Я написал базовую программу hello world для тестирования компилятора.

1       IDENTIFICATION DIVISION.
2       PROGRAM-ID. HELLO-WORLD.
3      *---------------------------
4       DATA DIVISION.
5      *---------------------------
6       PROCEDURE DIVISION.
7           DISPLAY 'Hello, world!'.
8           STOP RUN.

Эта программа называется HelloWorld.cbl. Когда я компилирую программу с командой

cobc HelloWorld.cbl

HelloWorld.so производится. Когда я пытаюсь запустить скомпилированную программу, используя

cobcrun HelloWorld

Я получаю следующую ошибку:

libcob: entry point 'HelloWorld' not found

Может кто-нибудь объяснить мне, что является точкой входа в GnuCOBOL, и, возможно, предложить способ исправить проблему и успешно выполнить эту программу COBOL?

2 ответа

Решение

Согласно официальному руководству GNUCOBOL, вы должны скомпилировать свой код с:

cobc -x HelloWorld.cbl

затем запустить его с

./HelloWorld

Вы также можете прочитать вики-страницу GNUCOBOL, которая содержит некоторые примеры для получения дополнительной информации.

PS Как сказал Саймон Собиш, если вы измените имя файла на HELLO-WORLD.cbl чтобы соответствовать идентификатору программы, те же команды, которые вы использовали, будут в порядке:

cobc HELLO-WORLD.cbl
cobcrun HELLO-WORLD

Может кто-нибудь объяснить мне, что является точкой входа в GnuCOBOL, и, возможно, предложить способ исправить проблему и успешно выполнить эту программу COBOL?

Точка входа - это точка, в которой вы можете ввести общий объект (на самом деле это больше C, чем COBOL). GnuCOBOL генерирует точки входа для каждого PROGRAM-ID, FUNCTION-ID а также ENTRY, Поэтому ваша точка входа HELLO-WORLD (который, вероятно, получает преобразование как - недопустимый идентификатор в ANSI C - вам не придется об этом думать, когда CALLв программе, поскольку преобразование будет выполнено внутри).

С помощью cobcrun внутренне делает:

  1. поиск общего объекта (в вашем случае HelloWord), так как он найден (потому что вы его сгенерировали), он будет загружен
  2. поиск точки входа во всех загруженных модулях - которая не найдена

Есть три варианта, чтобы заставить это работать:

  • Как уже упоминалось в ответе Ho1: используйте cobc -xпричина, по которой это работает, заключается в том, что вы вообще не генерируете общий объект, а C main, который вызывается напрямую (= точка входа не применяется вообще)
  • предварительно загрузить общий объект и вызвать программу его PROGRAM-ID (точка входа), либо вручную с COB_PRE_LOAD=HelloWorld cobcrun HELLO-WORLD или через cobcrun (опция доступна с GnuCOBOL 2.x) cobcrun -M HelloWorld HELLO-WORLD
  • изменить PROGRAM-ID чтобы соответствовать имени источника (переименуйте или измените источник, я бы сделал второе: PROGRAM-ID. HelloWorld.)
Другие вопросы по тегам