gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:05:43 30 4
gpt4 key购买 nike

我正在从 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com