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