3

我已经在我的 Ubuntu 17.04 系统上安装了 GnuCOBOL 2.2。我编写了一个基本的 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 程序的方法吗?

4

2 回答 2

5

根据GNUCOBOL 的官方手册,你应该编译你的代码:

cobc -x HelloWorld.cbl

然后运行它

./HelloWorld

您还可以阅读GNUCOBOL wiki 页面,其中包含一些示例以获取更多信息。

PS 正如 Simon Sobisch 所说,如果您将文件名更改HELLO-WORLD.cbl为与程序 ID 匹配,那么您使用的相同命令就可以了:

cobc HELLO-WORLD.cbl
cobcrun HELLO-WORLD
于 2017-11-12T07:15:17.677 回答
3

任何人都可以向我解释 GnuCOBOL 中的入口点是什么,并可能提出解决问题并成功执行此 COBOL 程序的方法吗?

入口点是您可以输入共享对象的点(这实际上是 C 而不是 COBOL)。GnuCOBOL 为每个 和 生成PROGRAM-ID入口FUNCTION-IDENTRY。因此,您的入口点是HELLO-WORLD(它可能会进行转换,因为-ANSI C 中没有有效的标识符 - 您在编写程序时不必考虑这一点,CALL因为转换将在内部完成)。

在内部使用cobcrun会:

  1. 搜索共享对象(在您的情况下HelloWord),因为找到它(因为您已经生成它)它将被加载
  2. 在所有加载的模块中搜索入口点 - 未找到

有三种可能的选择可以让这个工作:

  • 正如Ho1的回答中提到的: use cobc -x,这样做的原因是因为您根本不生成共享对象,而是直接调用的C main (=入口点根本不适用)
  • PROGRAM-ID通过 cobcrun手动或通过 cobcrun预加载共享对象并通过其(入口点)调用程序COB_PRE_LOAD=HelloWorld cobcrun HELLO-WORLD(自 GnuCOBOL 2.x 起可用的选项)cobcrun -M HelloWorld HELLO-WORLD
  • 更改PROGRAM-ID以匹配源名称(重命名或更改源,我会做第二个PROGRAM-ID. HelloWorld.:)
于 2017-11-12T08:26:52.863 回答