2011-11-27 8 views
7

Sto provando a compilare il test NIF da Erlang (http://www.erlang.org/doc/man/erl_nif.html) su Mac OS X Lion. Non riesco a farlo compilare. Mi manca una bandiera del compilatore? Ecco l'errore che ottengo:Test NIF Erlang - 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 

Ho anche provato questo con -m32 ma dice che non c'è architettura i386 neanche.

Grazie!

risposta

11

a 64 bit Erlang, le seguenti opere per me:

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

Ricerca dinamica è! Grazie :) – batman

+0

Grazie mille per questa risposta :) – ttvd

2

Sembra che il tuo problema non sia l'architettura ma il simbolo non definito _enif_make_string, il che significa che devi collegarti alla tua libreria enif, qualunque essa sia, usando l'opzione -l. Inoltre, è passato molto tempo da quando ho creato una libreria condivisa per OS X, ma penso che il flag corretto da utilizzare sia -dynamiclib e non -shared e non sia necessario uno spazio dopo -I.

+0

Se ho la # direttiva 'include' e il flag -I, non dovrebbe essere sufficiente per fare riferimento al file include? Controlla il link. Grazie! – batman

+1

@TravisPowell: No, '# include 'è sufficiente solo per la compilazione ma non per il collegamento. Il tuo bug è nel collegamento, vedi 'ld: sym ...'. È un bug del linker. –

1

Provare a utilizzare questi flag quando si compila la tua NIF invece di -shared

-bundle -flat_namespace -undefined suppress