根据Micro支持站点中的文档,要从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 发布于 2016-12-20 12:17:50
如果您使用MF,那么您可能可以获得付费支持。在任何情况下,我可以告诉你,从gcc和图书馆的一些知识。
C编译器编译得很好。它只抱怨char *或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文档,但没有找到您需要的库名。也许是libcob,libcobmf,libmfcob或者..。
编辑:,我在一个名为libcobol库的旧MF手册中找到了一个引用。
一旦您知道库名,就使用-lname (例如,-lcobol/ -lcob/ -lcobmf/-lmfcob)让链接器知道它可以在这个库中解析它们。添加-L/path/to/library,让链接器知道在哪里可以找到库。
如果编译成功,您的主程序会抱怨“无法找到libcob.so”(或libcobmf.so或其他名称),将LD_LIBRARY_PATH设置为指向库名。
https://stackoverflow.com/questions/41238940
复制相似问题