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 文档,但没有找到您需要的库名称。也许是 libcob
或 libcobmf
或 libmfcob
或 ...
编辑: 我在一本旧的 MF 手册中找到了一个参考,命名库 libcobol
。
一旦知道库名就使用-lname
(例如-lcobol
/-lcob
/-lcobmf
/-lmfcob
)让链接器知道它可以在这个库中解决它们。添加 -L/path/to/library
让链接器知道它可以在哪里找到库。
如果编译成功,您的主程序会抱怨 "cannot find libcob.so"(或 libcobmf.so 或任何名称)设置 LD_LIBRARY_PATH
指向库名称。
根据 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 文档,但没有找到您需要的库名称。也许是 libcob
或 libcobmf
或 libmfcob
或 ...
编辑: 我在一本旧的 MF 手册中找到了一个参考,命名库 libcobol
。
一旦知道库名就使用-lname
(例如-lcobol
/-lcob
/-lcobmf
/-lmfcob
)让链接器知道它可以在这个库中解决它们。添加 -L/path/to/library
让链接器知道它可以在哪里找到库。
如果编译成功,您的主程序会抱怨 "cannot find libcob.so"(或 libcobmf.so 或任何名称)设置 LD_LIBRARY_PATH
指向库名称。