MicroFocus cobol 命令 cobinit、cobcall 和 cobtidy 在我的 C 程序中抛出错误

MicroFocus cobol commands cobinit,cobcall and cobtidy are throwing errors in my C program

根据 Micro-focus 支持站点中的文档,要从 C 程序调用 cobol 程序,我们只需按照以下步骤操作即可。

main(int argv, char *argv)
{

cobinit();             /* Initialize COBOL environment */

cobcall("cobep", 0, NULL); /* Call a COBOL program */

cobtidy();             /* Close down COBOL environment */

return(0);

} 

基于此,我想出了一个简单的 C 程序来调用已经工作的 Cobol 程序,但我猜我遇到了链接错误。

C程序

cat call.c

#include<stdio.h> 
#include "cobcall.h" 
#include "cobmain.h" 

int main() 
{ 

int ret=0; 
cobinit(); 
ret=cobcall("cobolprogram.gnt",1,NULL); 
cobtidy(); 

return 0; 
} 

接收错误信息

gcc -Wall call.c -o call 
call.c: In function 'main': 
call.c:10: warning: pointer targets in passing argument 1 of 'cobcall'   differ in signedness 
/usr/ccs/bin/ld: Unsatisfied symbols: 
cobtidy (first referenced in /tmp/ccQBPw6r.o) (code) 
cobcall (first referenced in /tmp/ccQBPw6r.o) (code) 
cobinit (first referenced in /tmp/ccQBPw6r.o) (code) 
collect2: ld returned 1 exit status 

如果您使用 MF,那么您可能可以获得付费支持。无论如何,这就是我可以告诉你的关于 gcc 和库的一些知识。

C 编译器可以正常编译。它只抱怨 char *const char * 的符号,但这应该无关紧要。 为了解决 header 中 cobcall 实际定义的检查,我假设将其更改为其中之一应该修复编译器警告:

ret=cobcall((char *)"cobolprogram.gnt",1,NULL); 
ret=cobcall((const char *)"cobolprogram.gnt",1,NULL);
ret=cobcall((unsigned char *)"cobolprogram.gnt",1,NULL); 
ret=cobcall((const unsigned char *)"cobolprogram.gnt",1,NULL);

旁注:据我所知,您没有将文件扩展名传递给 cobcall,因此要使其稍后工作,您可能需要删除 .gnt 部分。

您收到的错误来自链接器,因为它无法解析这些 mf 特定函数。我浏览了不同的 MF 文档,但没有找到您需要的库名称。也许是 libcoblibcobmflibmfcob 或 ...

编辑: 我在一本旧的 MF 手册中找到了一个参考,命名库 libcobol

一旦知道库名就使用-lname(例如-lcobol/-lcob/-lcobmf/-lmfcob)让链接器知道它可以在这个库中解决它们。添加 -L/path/to/library 让链接器知道它可以在哪里找到库。

如果编译成功,您的主程序会抱怨 "cannot find libcob.so"(或 libcobmf.so 或任何名称)设置 LD_LIBRARY_PATH 指向库名称。