Ocaml + LLVM под Cygwin (или, в более общем случае, статически связывать с объектными файлами C под Cygwin)? - PullRequest
6 голосов
/ 26 декабря 2010

Тесты для привязок Ocaml (которые автоматически устанавливаются, если вы делаете LLVM с уже установленным Ocaml) все проваливаются под 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

Поиск в Google показывает, что это не относится к LLVM , и что у других людей такая же проблема, но я не смог найти решение.У меня установлен flexdll.Я просто не ссылаюсь на него правильно?

Это работает для меня в моей системе Linux, так что я думаю, что это что-то особенное в том, что я делаю на Cygwin.Есть предложения?

Ответы [ 2 ]

1 голос
/ 04 января 2011

flexlink вызывается ocamlopt во время компоновки, запускается с параметром -verbose, чтобы увидеть, как он вызывается и чего не хватает.Параметр -cc g++ выглядит особенно подозрительно, поскольку он, вероятно, отбрасывает flexlink и использует вместо него g ++ в качестве компоновщика, который, конечно, не может найти символы flexdll (на который ссылается код ocaml, созданный ocamlopt с поддержкой flexlink).

0 голосов
/ 28 декабря 2010

Я не знаю 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 не является хорошим измерением.

...