我正在从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,即我收到错误。
答案 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);