0

我试图将 hello.cob 编译为 hello.c:

$ ls
hello.cob
$ cobc -x -C hello.cob
$ ls
hello.c  hello.c.h  hello.c.l.h  hello.cob

clang未能将 hello.c 编译为可执行文件:

$ clang hello.c
/tmp/hello-479acf.o: In function `main':
hello.c:(.text+0x1e): undefined reference to `cob_init'
hello.c:(.text+0x2a): undefined reference to `cob_stop_run'
/tmp/hello-479acf.o: In function `sampleCOBOL_':
hello.c:(.text+0x98): undefined reference to `cob_module_global_enter'
hello.c:(.text+0x133): undefined reference to `cob_display'
hello.c:(.text+0x13f): undefined reference to `cob_stop_run'
hello.c:(.text+0x15a): undefined reference to `cob_check_version'
hello.c:(.text+0x33d): undefined reference to `cob_set_cancel'
hello.c:(.text+0x38e): undefined reference to `cob_fatal_error'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这是hello.cob(可以编译cobc -x hello.cob):

      IDENTIFICATION DIVISION.
      PROGRAM-ID. sampleCOBOL.
      PROCEDURE DIVISION.
      DISPLAY "Hello World!".
      STOP RUN.
4

1 回答 1

0

我很确定 clang 不会编译 C 源代码,因为您没有任何 C 编译器警告或错误。它无法链接生成的目标文件,因为您没有告诉 clang 链接到 libcob 并且没有“魔法”让 clang 知道在哪里可以找到它的符号。添加-lcob到您的clang调用中可能已经足够了。

如果您想知道如何cobc调用编译器/链接器添加-v到您的cobc调用中。

注意:如果这个版本cobc是用它构建的,gcc它也默认使用gcc。您可以看到cobc --info它还显示是否有任何内置命令被环境变量覆盖。附加说明:cobc不仅调用 C 编译器/链接器,它还为构建它的编译器生成特定的 C 代码。关于 C 生成最重要的部分是-f[no-]computed-goto,以防 C 编译器抱怨(在你的情况下没有)。

于 2018-02-27T19:08:51.467 回答