gcc与GnuCOBOL相互调用代码

一、安装GnuCOBOL

  获得最新版本的源代码:

wget https://nchc.dl.sourceforge.net/project/open-cobol/gnu-cobol/2.0/gnu-cobol-2.0_rc-2.tar.gz

tar zxvf gnu-cobol-2.0_rc-2.tar.gz

cd gnu-cobol-2.0/

 ./configure --prefix=/opt/local

make&sudo make install

这里/opt/local是我的安装位置,你可以换成自己的目录,不过要设置好环境。如

PATH,MANPATH,LD_LIBRARY_PATH

二、代码

cob程序片段代码

$ cat say.cob 
       IDENTIFICATION DIVISION.
       PROGRAM-ID. say.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       LINKAGE SECTION.
       01 hello PIC X(7).
       01 world PIC X(6).
       PROCEDURE DIVISION USING hello world.
           DISPLAY hello world.
           EXIT PROGRAM.

主程序c语言代码

$ cat hello.c
#include <libcob.h>
extern int say(char *hello, char *world);
int
main()
{
	int ret;
	char hello[8] = "Hello, ";
	char world[7] = "world!";
	cob_init(0, NULL);
	ret = say(hello, world);
	return ret;
}

三、编译运行

$ gcc -c `cob-config --cflags` hello.c
$ cobc -c -static say.cob
$ cobc -x -o hello hello.o say.o
$ ./hello 
Hello, world!

四、makefile

$ cat config.mk 

# Edit the following for your installation

CC	=	gcc
CXX	=	g++
COBC=	/opt/local/bin/cobc
COBF	=/opt/local/bin/cob-config

LFLAGS	=	`$(COBF) --libs`
INCPATH	=	`$(COBF) --cflags`
####### Implicit rules

.SUFFIXES: .o .c .cpp .cc .cxx .C .cob

.cpp.o:
	$(CXX) -c  -o "$@" "$<"

.cc.o:
	$(CXX) -c   -o "$@" "$<"

.cxx.o:
	$(CXX) -c -o "$@" "$<"

.C.o:
	$(CXX) -c  -o "$@" "$<"

.c.o:
	$(CC) -c  $(INCPATH) -o "$@" "$<"

.cob.o:
	$(COBC) -c  -static -o "$@" "$<"

 

CONFIG = ./config.mk
include $(CONFIG)

#==============================================================
# This program's code files
PRG		=hello
OBJS	=hello.o  say.o
#==============================================================
# File dependencies and rules

all:	$(PRG)

$(PRG): $(OBJS)
	$(COBC) -x -o $@ $(OBJS)
clean:
	rm -f *~
	rm -f *.o
	rm -f core
	rm -f $(PRG)

    $(COBC) -x -o $@ $(OBJS)

可以改为:

    $(CC) -o $@ $(OBJS) $(LFLAGS) 

也就是说用cobc连接时不需要指明cobol库的位置,而用gcc链接时需要

五、cobol调用c模块

c代码:

$ cat say.c 
#include <stdio.h>

int say(char *hello, char *world)
{
	int i;
	for(i = 0; i < 7; i++)
	  putchar(hello[i]);
	for(i = 0; i < 6; i++)
	  putchar(world[i]);
	putchar('\n');
	return 0;
}

cob主程序代码

$ cat hello.cob 
       IDENTIFICATION DIVISION.
       PROGRAM-ID. hello.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 hello PIC X(7) VALUE "Hello, ".
       01 world PIC X(6) VALUE "world!".
       PROCEDURE DIVISION.
       CALL "say" USING hello world.
       STOP RUN.

编译运行:

$ cc -c say.c
$ cobc -c -static -x hello.cob
$ cobc -x -o hello hello.o say.o
$ ./hello 
Hello, world!

makefile:

只需修改config.mk

.cob.o:
    $(COBC) -c  -static -o "$@" "$<"

中加-x即改为:

.cob.o:
    $(COBC) -c  -static -x -o "$@" "$<"

否则出现main函数未定义引用错误。

当然

.c.o:

    $(CC) -c $(INCPATH) -o "$@" "$<

中的$(INCPATH)也可以去掉

转载于:https://my.oschina.net/u/2245781/blog/915580

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值