Точка входа 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
внутренне делает:
- поиск общего объекта (в вашем случае
HelloWord
), так как он найден (потому что вы его сгенерировали), он будет загружен - поиск точки входа во всех загруженных модулях - которая не найдена
Есть три варианта, чтобы заставить это работать:
- Как уже упоминалось в ответе 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.
)