2011-11-27 10 views
7

Estoy intentando compilar la prueba NIF de Erlang (http://www.erlang.org/doc/man/erl_nif.html) en Mac OS X Lion. No puedo hacer que compile. ¿Me falta una bandera del compilador? Aquí está el error que consigo:Prueba Erlang NIF - OS X Lion

Computer:~ me $ gcc -fPIC -shared -o niftest.so niftest.c -I /usr/local/Cellar/erlang/R14B02/lib/erlang/usr/include/ 
Undefined symbols for architecture x86_64: 
    "_enif_make_string", referenced from: 
     _hello in ccXfh0oG.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

También he intentado esto con -m32 pero dice que no hay arquitectura i386 tampoco.

Gracias!

Respuesta

11

de 64 bits Erlang, las siguientes obras para mí:

gcc -undefined dynamic_lookup -dynamiclib niftest.c -o niftest.so \ 
    -I /usr/local/Cellar/erlang/R14B02/lib/erlang/usr/include 
+0

Búsqueda dinámica es! Gracias :) – batman

+0

Muchas gracias por esta respuesta :) – ttvd

2

Parece que su problema no es la arquitectura, sino el símbolo indefinido _enif_make_string, lo que significa que tiene que vincular con su biblioteca enif, sea lo que sea, usando la opción -l. Además, ha pasado mucho tiempo desde que construí una biblioteca compartida para OS X, pero creo que la bandera correcta para usar es -dynamiclib y no -shared, y no es necesario que tenga un espacio después de -I.

+0

Si tengo la directiva '# include' y el indicador -I, ¿no debería ser suficiente para hacer referencia al archivo de inclusión? Mira el enlace. ¡Gracias! – batman

+1

@ TravisPowell: No, '# include' es suficiente solo para compilar, pero no para vincular. Tu error está en vincular, mira 'ld: sym ...'. Es un error de linker. –

1

Trate de usar estas banderas al compilar su NIF en lugar de -shared

-bundle -flat_namespace -undefined suppress