我正在尝试从C程序中调用一些ocaml代码。我一直在关注一些文档here。 c程序名为hello.c
,它正在尝试使用callme.ml
中定义的Ocaml函数。
在链接中,我分两步执行此操作:首先将ml文件编译为目标文件:
ocamlopt -output-obj -o callme2.o callme.ml
然后尝试使用以下代码将其链接到我的'main'二进制文件:
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中定义两次相同的函数名是违法的。也许这是该文件中的例外之一。
答案 0 :(得分:2)
您的命令行有点奇怪,因为-lasmrun
显示两次。
这对我有用:
$ W=`ocamlopt -where`
$ gcc -I $W -L $W -o hello hello.c callme.o -lasmrun -lm -ldl
您可以在我的伪博客中看到一个工作示例:Further OCaml GC Disharmony。
(正如我学到的那样,确保你遵守GC和谐的规则: - )