cygwin下的Ocaml + LLVM(或者更常见的是,在cygwin下静态链接C对象文件)?

时间:2010-12-26 20:20:03

标签: linker cygwin ocaml llvm

Ocaml绑定的测试(如果你已经安装了Ocaml的LLVM会自动安装)都会在cygwin下失败,当我尝试创建最简单的程序时,我得到的错误都是所有内置的-in测试失败:

> ocamlopt -I +llvm-2.8 -cc g++ llvm.cmxa llvm_bitwriter.cmxa llvm_trivial.ml -o llvm_trivial
/usr/lib/ocaml/libasmrun.a(unix.o):unix.c:(.text+0x14a): undefined reference to `_flexdll_dlerror'
/usr/lib/ocaml/libasmrun.a(unix.o):unix.c:(.text+0x177): undefined reference to `_flexdll_dlopen'
/usr/lib/ocaml/libasmrun.a(unix.o):unix.c:(.text+0x193): undefined reference to `_flexdll_dlopen'
/usr/lib/ocaml/libasmrun.a(unix.o):unix.c:(.text+0x1a2): undefined reference to `_flexdll_dlsym'
/usr/lib/ocaml/libasmrun.a(unix.o):unix.c:(.text+0x1bc): undefined reference to `_flexdll_dlsym'
/usr/lib/ocaml/libasmrun.a(unix.o):unix.c:(.text+0x1cf): undefined reference to `_flexdll_dlclose'
collect2: ld returned 1 exit status
File "caml_startup", line 1, characters 0-1:
Error: Error during linking

谷歌搜索表示this isn't LLVM specific,其他人有同样的问题,但我找不到解决方案。我安装了flexdll。我没有正确引用它吗?

这对我的Linux系统起作用,所以我觉得这对我在cygwin上做的事情是特别的。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

flexlink在链接期间由ocamlopt调用,使用-verbose选项运行以查看它是如何被调用的以及缺少的内容。 -cc g++选项看起来特别可疑,因为它可能会丢弃flexlink并使用g ++作为链接器,这当然找不到flexdll符号(引自flexlink-aware ocamlopt生成的ocaml代码)。

答案 1 :(得分:0)

我不知道ocaml,但看起来你必须使用 flexlink 。 缺少的定义位于.o中的/usr/lib/flexdll/文件中,并且有一个名为/bin/flexlink的特殊链接器。

http://alain.frisch.fr/flexdll.html提倡这一点:
  flexlink -chain cygwin -exe -o dump.exe dump.o

linux在运行时解析缺少的符号,因此linux不是一个好的衡量标准。