从COBOL调用外部C库

qyzbxkaa  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(103)

我extperimenting COBOL最后一次,我有麻烦与链接和外部调用与COBOL
首先,我有一个简单的测试库源代码:

// testlib.c
#include <stdio.h>

void CFUNC() {
    printf("This is a C function.\n");
}

字符串
我用以下代码编译我的库:gcc -c -o testlib.o testlib.car rcs libout.a testlib.o之后
我有一个cobol源文件:

IDENTIFICATION DIVISION.
PROGRAM-ID. CallCFunction.

PROCEDURE DIVISION.
    EXTERNAL "CFUNC".
    CALL "CFUNC"
    STOP RUN.


我用cobc -x -free -o cobollink cobollink.cbl -L/path/to/lib -lout编译这个
我遇到了这个错误:

cobollink.cbl:6: error: syntax error, unexpected EXTERNAL


“外部”不应该在这里。代码在没有EXTERNAL的情况下编译良好,但找不到CFUNC
如何调用我的C函数?

$cobc -V
cobc (GnuCOBOL) 4.0-early-dev.0
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Keisuke Nishida, Roger While, Ron Norman, Simon Sobisch, Edward Hart
Built     Sep 14 2021 19:23:38
Packaged  Jun 06 2020 20:56:36 UTC
C version "11.2.0"


(使用UBUNTU 22.04)
谢啦,谢啦

mzaanser

mzaanser1#

我可以通过以下方式让它工作:

  • 相同的CFUNC文件内容

几处改动:

  • gcc -c CFUNC.c -o CFUNC.o编译(不是静态库,如果你需要静态库,我可以研究一下,只是根据我快速研究的结果)
  • 新的test.cbl(只需要删除EXTERNAL关键字):
IDENTIFICATION DIVISION.
PROGRAM-ID. CallCFunction.

PROCEDURE DIVISION.
    CALL "CFUNC"
    STOP RUN.

字符串

  • cobc -x -free -o cobollink test.cbl CFUNC.o编译(假设CFUNC.o和COBOL源代码在同一个文件夹中)

输出量:

<path...>/Experiments/COBOL/c_from_cobol$ ./cobollink 
This is a C function.

drnojrws

drnojrws2#

您可能有兴趣尝试gcobol,一个基于gcc的新COBOL编译器。已经开发了18个月了,而且还很强劲。

$ gcc -c -o test.o  test.c
$ gcobol -oo test.cbl test.o
$ ./o
This is a C function.
$

字符串
在gcobol中,CALL目标默认转换为小写,使其不区分大小写,与ISO标准一致。要使示例正常工作,C函数必须是小写的,或者使用CDF CALL-CONVENTION语句逐字调用目标。

相关问题