找不到 GnuCOBOL 入口点

GnuCOBOL entry point not found

我已经在 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 程序的方法吗?

根据 official manual of GNUCOBOL,你应该编译你的代码:

cobc -x HelloWorld.cbl

然后 运行 它与

./HelloWorld

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

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

cobc HELLO-WORLD.cbl
cobcrun HELLO-WORLD

Can anyone explain to me what an entry point is in GnuCOBOL, and perhaps suggest a way to fix the problem and successfully execute this COBOL program?

入口点是您可以输入共享对象的点(这实际上比 COBOL 更 C)。 GnuCOBOL 为每个 PROGRAM-IDFUNCTION-IDENTRY 生成入口点。因此,您的入口点是 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.