2011-11-27 17 views
7

Próbuję skompilować test NIF z Erlang (http://www.erlang.org/doc/man/erl_nif.html) na Mac OS X Lion. Nie mogę go skompilować. Czy brakuje mi flagi kompilatora? Tutaj jest błąd pojawia się:Test 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 

Próbowałem to również z -m32 ale mówi, że nie ma architektury i386 albo.

Dzięki!

Odpowiedz

11

dla 64-bitowych Erlang, następujące prace dla mnie:

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

Dynamiczne wyszukiwanie to! Dzięki :) – batman

+0

Dziękuję bardzo za tę odpowiedź :) – ttvd

2

Wygląda na to, że Twoim problemem nie jest architektura, ale niezdefiniowany symbol _enif_make_string, co oznacza, że ​​musisz połączyć się z biblioteką enif, cokolwiek to jest, używając opcji -l. Minęło sporo czasu, odkąd zbudowałem wspólną bibliotekę dla OS X, ale uważam, że właściwą flagą do użycia jest -dynamiclib, a nie -shared, i nie musisz mieć miejsca po -I.

+0

Jeśli mam '# dyrektywy include' a flaga -I nie powinna wystarczyć do odniesienia się do pliku include? Sprawdź link. Dzięki! – batman

+1

@TravisPowell: Nie, '# include' wystarczy tylko do kompilowania, ale nie do łączenia. Twój błąd jest w linkowaniu, zobacz 'ld: sym ...'. To jest błąd linkera. –

1

Spróbuj użyć te flagi podczas kompilacji nJezeli zamiast -shared

-bundle -flat_namespace -undefined suppress