调用Cobol子程序GETSUM报错libcob: module 'GETSUM' not found如何解决
GnuCobol子程序找不到报错的排查解决步骤
1. 先修正代码语法错误
两份代码存在三处会导致编译失败的问题:
- 子程序
GETSUM的过程部声明末尾有多余标点,原代码:
修正为:PROCEDURE DIVISION USING LNum1, LNum2, LSum,.PROCEDURE DIVISION USING LNum1, LNum2, LSum. - 子程序
LINKAGE SECTION的变量不需要加VALUE属性,链接段变量值由外部传入,写VALUE属于无效语法,直接删掉即可。 - 主程序
DISPLAY行的"是HTML转义字符,实际代码替换为英文双引号"。
2. 确认编译命令符合GnuCobol规则
libcob找不到模块的核心原因是子程序没有被编译器纳入可调用范围,有两种编译方案可选:
方案一:一次性关联编译所有源文件
假设主程序文件名为main.cbl,子程序文件名为getsum.cbl,直接运行命令:
cobc -x -o main main.cbl getsum.cbl
参数说明:
-x指定生成可执行文件-o main指定输出的可执行文件名为main
把两个源文件同时放入编译列表,编译器会自动绑定主程序和子程序的调用关系,运行时直接执行./main即可。
方案二:分开编译主程序和子程序模块
如果需要单独维护子程序,可先把子程序编译为共享模块:
cobc -m getsum.cbl
-m 参数会生成后缀为.so的可调用模块文件getsum.so,再编译主程序:
cobc -x -o main main.cbl
运行前需要把当前目录加入GnuCobol的模块搜索路径,执行命令:
export COB_LIBRARY_PATH=. && ./main
3. 附加校验项
确认主程序中CALL 'GETSUM'的字符串内容,和子程序PROGRAM-ID. GETSUM.的名称完全一致,GnuCobol默认对模块名区分大小写,拼写不一致也会触发找不到模块的报错。
内容的提问来源于stack exchange,提问作者felipe de jesus
相关产品推荐
相关产品推荐

