2010-12-26 13 views
6

Testy dla wiązaniami SML (które są instalowane automatycznie, jeśli uczynić LLVM z SML już zainstalowany) wszystkich zawieść pod Cygwin, a gdy próbuję tworzyć nawet najbardziej trywialny program, otrzymuję ten sam błąd, że wszyscy wbudowanej Podczas testów nie na:Ocaml + LLVM pod cygwin (lub, bardziej ogólnie, statycznie łączenie z plikami obiektów C pod 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 

googlowania wokół wskazuje, że this isn't LLVM specific i że inne osoby mają ten sam problem, ale nie mogę znaleźć rozwiązania. Mam zainstalowany flexdll. Czy po prostu nie odwołuję się do niego poprawnie?

To działa dla mnie na moim systemie Linux, więc myślę, że jest to coś szczególnego dla tego, co robię na cygwin. Jakieś sugestie?

Odpowiedz

1

Flexlink jest wywoływany przez ocamlopt podczas łączenia, uruchamiane z opcją -verbose, aby zobaczyć, jak zostanie wywołane i czego brakuje. Opcja -cc g++ wygląda szczególnie podejrzanie, ponieważ prawdopodobnie zrywa flexlink i zamiast tego używa g ++ jako łącznika, który oczywiście nie może znaleźć symboli Flexdll (odniesionych do kodu ocaml generowanego przez ocamlopt zgodny z Flexlink).

0

Nie wiem, ocaml, ale wygląda na to, że musisz użyć flexlink. Brakujące definicje znajdują się w plikach .o w /usr/lib/flexdll/, a istnieje specjalny linker o nazwie /bin/flexlink.

http://alain.frisch.fr/flexdll.html zwolennicy tak:
flexlink -chain cygwin -exe -o dump.exe dump.o

linux postanawia brakujące symbole w czasie wykonywania, więc linux ma dobry pomiar.