我正在尝试从C程序调用一些ocaml代码。我一直在关注here文档。 C程序称为hello.c,它正在尝试使用callme.ml中定义的Ocaml函数。

如链接中所述,我分两个步骤进行操作:首先将ml文件编译为目标文件:

ocamlopt -output-obj -o callme2.o callme.ml

然后尝试使用以下代码将其链接到我的“主”二进制文件:
gcc  -Wall -I`ocamlopt -where` -L`ocamlopt -where` -lasmrun -lm -ldl  -o hello hello.c callme2.o -lasmrun

但是我遇到了以下问题:libasmrun.a中已经定义了main,因此它与我自己的main中的hello.c冲突:
/tmp/ccANhYNH.o: In function `main':
hello.c:(.text+0x58): multiple definition of `main'
/home/orm/.opam/4.02.0/lib/ocaml/libasmrun.a(main.o):main.c:(.text+0x0): first defined here

我该如何解决?
(正如库路径所暗示的,我使用的是ocaml 4.02版)

更新:,此问题与C链接程序标志而不是ocaml的正确使用有关。按以下顺序使用标志可解决此问题:
gcc  -Wall -I`ocamlopt -where` -L`ocamlopt -where` -o hello hello.c -lasmrun callme2.o -lm -ldl -lasmrun

这很有趣,因为我认为在same program中定义两次相同的函数名称是非法的。也许这是该文档中的异常(exception)之一。

最佳答案

您的命令行有些奇怪,因为-lasmrun出现了两次。

这对我有用:

$ W=`ocamlopt -where`
$ gcc -I $W -L $W -o hello hello.c callme.o -lasmrun -lm -ldl

您可以在我的伪博客中看到一个有效的示例:Further OCaml GC Disharmony

(当我学到了很难的方法时,请确保您遵循GC协调规则:-)

关于c++ - ocaml asmrun库中已定义的主要功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31017992/

10-16 04:23