2010-12-26 2 views
6

Тесты для привязок Ocaml (которые автоматически устанавливаются, если вы устанавливаете LLVM с уже установленным Ocaml) все проваливаются под cygwin, и когда я пытаюсь создать даже самую тривиальную программу, я получаю ту же ошибку, что и все встроенные функции, в тесты не на:Ocaml + LLVM под cygwin (или, в более общем плане, статическая связь с объектными файлами C под cygwin)?

> 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. Какие-либо предложения?

ответ

1

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

0

Я не знаю ocaml, но похоже, что вы должны использовать flexlink. Недостающие определения находятся в файлах .o в /usr/lib/flexdll/, и есть специальный линкер под названием /bin/flexlink.

http://alain.frisch.fr/flexdll.html адвокаты это:
flexlink -chain cygwin -exe -o dump.exe dump.o

линукс решает недостающие символы во время выполнения, так линукс нет хорошего измерения.