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

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

这是我的C程序:

#include  #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 IO 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中的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页开始,但如果您继续在课程中使用COBOL-IT,整个文档将对您有用。

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

 Static linking of “C” programs with COBOL programs The “C” program /* hello.c */ #include  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. 

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

 #pragma linkage (VERKOOP, COBOL) extern void VERKOOP(char *productid, char *aantal); VERKOOP(productid, aantal);