使用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.
编译与运行步骤
编译子程序生成DLL:
cobc -m foo2.cob生成
foo2.dll。编译主程序生成EXE:
cobc -x foo1.cob -L c:\dev -l foo2生成
foo1.exe。运行
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
相关产品推荐
相关产品推荐

