从 C 程序调用 COBOL 程序,错误 LNKG2019 : unresolved external symbol _verkoop referenced in function _main

标签 c static-linking cobol

我正在从 C 程序调用 COBOL 程序,但我不断收到以下错误:错误 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.

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

最佳答案

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

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 页开始,但如果您在类(class)中继续使用 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.

关于从 C 程序调用 COBOL 程序,错误 LNKG2019 : unresolved external symbol _verkoop referenced in function _main,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20824661/

相关文章:

if-statement - COBOL 程序中的语法错误,如果发生意外

c - 如果在已经返回的线程上调用 pthread_detach 会发生什么

c - 32 位系统中指针可以拥有的值的数量

c - 在 Linux 内核中使用模块覆盖功能

linux - 链接错误: undefined reference to static libarary

history - COBOL 历史中未提及的部分

c - sqlite3_open 无法识别 C 中的 URI 文件名

c - 如何用C语言设计静态库的接口(interface)

c++ - 链接错误 : templated friend operator overload

syntax-error - 为什么在识别部门出现错误?