You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GnuCOBOL(cobc)调用外部子程序失败,模块SUB-SAY-HELLO2未找到

GnuCOBOL 3.2.0 Windows下外部子程序调用失败解决方法

问题场景

你在Windows系统使用GnuCOBOL (cobc) 3.2.0编写跨文件调用的COBOL程序时,主程序无法找到外部子程序,相关代码与操作如下:

主程序 foo1.cob

IDENTIFICATION DIVISION.
       PROGRAM-ID. MAINPROG.

       PROCEDURE DIVISION.
       MAIN-PROCEDURE.
           PERFORM "SUB-SAY-HELLO1".
           CALL "SUB-SAY-HELLO2".
           STOP RUN.

        SUB-SAY-HELLO1.
           DISPLAY "HELLO1".

子程序 foo2.cob

IDENTIFICATION DIVISION.
       PROGRAM-ID. SUBPROG.

       PROCEDURE DIVISION.
       SUB-SAY-HELLO2.
           DISPLAY "HELLO2!".
           EXIT PROGRAM.

编译与运行步骤

  1. 编译子程序生成DLL:

    cobc -m foo2.cob
    

    生成foo2.dll。

  2. 编译主程序生成EXE:

    cobc -x foo1.cob -L c:\dev -l foo2
    

    生成foo1.exe。

  3. 运行foo1.exe后报错:

    HELLO1
    libcob: error: module 'SUB-SAY-HELLO2' not found
    

解决方法

1. 修正子程序的PROGRAM-ID

GnuCOBOL中,CALL指令是通过**子程序的PROGRAM-ID**来定位外部模块的,而非段落名。你的主程序调用的是"SUB-SAY-HELLO2",但子程序的PROGRAM-ID是SUBPROG,两者不匹配导致找不到模块。

修改foo2.cob的PROGRAM-ID为SUB-SAY-HELLO2,保持与调用名一致:

IDENTIFICATION DIVISION.
       PROGRAM-ID. SUB-SAY-HELLO2.

       PROCEDURE DIVISION.
       SUB-SAY-HELLO2.
           DISPLAY "HELLO2!".
           EXIT PROGRAM.

2. 重新编译子程序

修改代码后,重新生成动态链接库:

cobc -m foo2.cob

3. 确保主程序编译时链接正确

如果foo2.dll在当前工作目录,编译主程序时可简化命令(若DLL在其他路径,需保留-L指定路径):

cobc -x foo1.cob -l foo2

4. 保证DLL可被系统找到

Windows运行foo1.exe时,需要能定位到foo2.dll,可通过以下方式实现:

  • 将foo2.dll复制到foo1.exe所在的同一目录;
  • 将foo2.dll所在路径添加到系统PATH环境变量;
  • 运行时通过SET PATH临时添加DLL所在路径。

内容的提问来源于stack exchange,提问作者Helena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:12:42