gcc与GnuCOBOL相互调用代码

原创
2017/06/06 15:34
阅读数 735

一、安装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)也可以去掉

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部