3

根据 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 
4

1 回答 1

3

如果您使用 MF,那么您可能可以获得付费支持。无论如何,我可以通过了解 gcc 和库来告诉您。

C编译器编译得很好。它只抱怨 a char *or的签名const char *,但这无关紧要。为了解决在标头中检查实际定义的问题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或...

编辑:我在名为 library 的旧 MF 手册中找到了参考libcobol

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

如果编译成功,您的主程序会抱怨“找不到 libcob.so”(或 libcobmf.so 或其他任何名称)设置LD_LIBRARY_PATH为指向库名称。

于 2016-12-20T12:17:50.577 回答