找不到 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-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.
)
我已经在 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-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.
)