2010-12-26 10 views
6

Las pruebas para los enlaces Ocaml (que se instalan automáticamente si se instala LLVM con Ocaml ya instalado) fallan bajo cygwin, y cuando trato de crear incluso el programa más trivial, obtengo el mismo error que todas las incorporaciones en pruebas fallan en:Ocaml + LLVM bajo cygwin (o, de manera más general, vinculando estáticamente con archivos de objeto C bajo 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 

buscar en Google en todo indica que this isn't LLVM specific, y que otras personas tienen el mismo problema, pero no pude encontrar una solución. Tengo instalado FlexDll. ¿Acaso no estoy haciendo referencia a esto correctamente?

Esto funciona para mí en mi sistema Linux, así que creo que es algo particular de lo que estoy haciendo en cygwin. ¿Alguna sugerencia?

Respuesta

1

flexlink es invocado por ocamlopt durante la vinculación, se ejecuta con la opción -verbose para ver cómo se llama y qué falta. La opción -cc g++ tiene un aspecto especialmente sospechoso, ya que probablemente deje caer a flexlink y use g ++ como un enlazador, que por supuesto no puede encontrar los símbolos flexdll (referenciados a partir del código ocaml generado por ocamlopt flexible).

0

No sé ocaml, pero parece que tiene que usar flexlink. Las definiciones faltantes están en los archivos .o en /usr/lib/flexdll/, y hay un enlazador especial llamado /bin/flexlink.

http://alain.frisch.fr/flexdll.html defensores de esta:
flexlink -chain cygwin -exe -o dump.exe dump.o

Linux resuelve símbolos que faltan en tiempo de ejecución, por lo que Linux no es una buena medida.

Cuestiones relacionadas