从C程序调用COBOL程序,ERROR LNKG2019:函数_main中引用的未解析的外部符号_verkoop

时间:2013-12-29 11:27:29

标签: c static-linking cobol

我正在从C程序调用COBOL程序,但我一直收到以下错误:ERROR LNKG2019:函数_main中引用了未解析的外部符号_verkoop。

这是我的C程序:

#include <stdio.h>
#include "libcob.h"
//#pragma linkage (verkoop, COBOL)

extern void verkoop(char *productid, char *aantal);

int main(int argc, char *argv[])
{
    char *productid = "000020";
    char *aantal = "000200";
    COB_RTD = cob_get_rtd();
    cob_init(rtd, 0, NULL);
    printf("Hello world");  
    verkoop(productid, aantal);
    return 0;
}

这是我的COBOL计划:

*************************************************************
* VERKOOP  
*************************************************************
       IDENTIFICATION DIVISION.
       PROGRAM-ID. VERKOOP.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT PRODUCTEN ASSIGN TO "BESTANDEN/PRODUCTEN"
           ACCESS MODE IS RANDOM
           ORGANIZATION IS INDEXED
           RECORD KEY IS PRODUCTID
           FILE STATUS IS WS-FILE-STATUS.

       DATA DIVISION.
       FILE SECTION.
       FD  PRODUCTEN BLOCK CONTAINS 10 RECORDS.
       01  PRODUCT.
           02 PRODUCTID PIC X(6).
           02 LEVERANCIERID PIC X(6).
           02 AANTAL PIC 9(6).
       WORKING-STORAGE SECTION.
       77  FOUT PIC X.
           88 PRODUCT-NIET-GEVONDEN VALUE 1.
       77 WS-PRODUCTID PIC X(6).
       77 WS-AANTAL PIC 9(6).
       77 WS-FILE-STATUS PIC XX.
       LINKAGE SECTION.
       01 LS-PRODUCTID PIC X(6).
       01 LS-AANTAL PIC 9(6).
       PROCEDURE DIVISION USING LS-PRODUCTID, LS-AANTAL.

       MAIN.
           PERFORM INITIALISEER
           PERFORM LEES-PRODUCT-IN
           PERFORM LEES-BESTAND
           PERFORM SLUIT-BESTAND
           STOP RUN.

       INITIALISEER.
           MOVE ZEROS TO PRODUCT
           OPEN I-O PRODUCTEN.
*          DISPLAY WS-FILE-STATUS..

       LEES-PRODUCT-IN.
           MOVE LS-PRODUCTID TO WS-PRODUCTID
           MOVE LS-AANTAL TO WS-AANTAL.
*          DISPLAY "GEEF PRODUCTID OP: "
*          ACCEPT WS-PRODUCTID
*          DISPLAY "GEEF AANTAL OP: "
*          ACCEPT WS-AANTAL.

       LEES-BESTAND.
*      DISPLAY "LEES-BESTAND"
       MOVE WS-PRODUCTID TO PRODUCTID
*      DISPLAY PRODUCTID
       READ PRODUCTEN INVALID KEY SET PRODUCT-NIET-GEVONDEN TO TRUE
       END-READ   
       DISPLAY "END-READ" WS-FILE-STATUS    
       IF PRODUCT-NIET-GEVONDEN PERFORM FOUTJE    
       ELSE 
       MOVE WS-PRODUCTID TO PRODUCTID
       SUBTRACT WS-AANTAL FROM AANTAL   
       PERFORM UPDATE-PRODUCT
       END-IF.


      UPDATE-PRODUCT.
        REWRITE PRODUCT INVALID KEY PERFORM FOUTJE.

        SLUIT-BESTAND.
*       DISPLAY "SLUIT-BESTAND"
           CLOSE PRODUCTEN.

        FOUTJE.
           DISPLAY "ER IS EEN FOUT OPGETREDEN"
*          DISPLAY WS-FILE-STATUS
           STOP RUN.

在MS VC的COBOL-IT COBOL Compiler Suite Enterprise中使用cobc -c命令编译。我尝试使用以下命令链接它们:cobc -x -flink-only -o exercise productverkoop-c.obj verkoop.obj,即我收到错误。

2 个答案:

答案 0 :(得分:2)

正如我在您对第一个问题的评论中所建议的那样,很容易找到您正在使用的编译器的文档(我在您确认哪个编译器之前找到了它,因此它非常简单。)

http://www.cobol-it.com/images/datacorner/pdf/pdf_getstarted_compilersuite_01-2011.pdf

其中包含一个使用您给出的COB_RTD代码从C程序调用COBOL程序的示例。

程序文件的情况很重要,正如您将在示例中看到的那样。我会使PROGRAM-ID与文件名的第一部分相同。这对于静态调用(我没有阅读文档)可能是必要的,并且可能与动态调用无关。

另请注意您在COBOL程序中使用STOP RUN。 GOBACK或EXIT PROGRAM是返回调用程序的常用方法,但如果您应该使用STOP RUN,您将找到处理STOP RUN结果的示例代码。

您需要从文档的第55页开始,但如果您继续在课程中使用COBOL-IT,整个文档将对您有用。

以下是简单示例C和COBOL程序。线程上更复杂的示例包括在COBOL程序中使用它时处理STOP RUN的示例代码。

Static linking of “C” programs with COBOL programs
The “C” program
/* hello.c */
#include <libcob.h>
extern int say(char *hello, char *world);
int main()
{
COB_RTD = cob_get_rtd();
int ret;
int return_status;
char hello[7] = "Hello ";
char world[7] = "World!";
cob_init(rtd, 0, NULL);
ret = say(hello, world);
cob_stop_run (rtd, return_status);
return ret;
}

COBOL计划

Say.cbl传递了两个字段,这些字段在链接部分中描述。 Say.cbl显示两个字段,然后退出。

say.cbl

IDENTIFICATION DIVISION.
PROGRAM-ID. say.
ENVIRONMENT DIVISION.
DATA DIVISION.
LINKAGE SECTION.
01 HELLO PIC X(6).
01 WORLD PIC X(6).
PROCEDURE DIVISION USING HELLO WORLD.
DISPLAY HELLO WORLD.
EXIT PROGRAM.

答案 1 :(得分:1)

我首先检查verkoop.obj中的符号verkoop是否为大写(使用dumpbin),如果它将所有引用verkoop更改为VERKOOP,例如:

#pragma linkage (VERKOOP, COBOL)

extern void VERKOOP(char *productid, char *aantal);

VERKOOP(productid, aantal);