2014-12-05 33 views
7

Podczas kompilacji pliku binarnego obserwuję różne zachowania łączące między dwoma komputerami.Co decyduje o powiązaniu z GHC w OS X?

Każdy ma taką samą GHC (7.8.3), ten sam kod, tak samo flagi (-Wall -O2), sam libgmp (zainstalowany przez Homebrew na siebie):

machine-one$ otool -L my-binary 
my-binary: 
     /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) 
     /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0) 

machine-two$ otool -L my-binary 
my-binary: 
     /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) 
     /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0) 
     /usr/local/lib/libgmp.10.dylib (compatibility version 13.0.0, current version 13.0.0) 

nie mogę dla życia mnie Sprawdź, dlaczego numer libgmp jest połączony dynamicznie na drugim komputerze.

Pod względem różnic, które udało mi się rozpoznać: GHC został zainstalowany przez binary distribution for OS X na pierwszym komputerze i Homebrew na drugim. W przypadku kompilatorów języka C mamy:

machine-one$ cc --version 
Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn) 
Target: x86_64-apple-darwin13.4.0 
Thread model: posix 

machine-two$ cc --version 
Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) 
Target: x86_64-apple-darwin13.4.0 
Thread model: posix 

Co zazwyczaj decyduje o działaniu powiązania i jak mogę wymusić jedną metodę łączenia lub drugą?

EDIT: Mam takie samo zachowanie zaobserwowano dzieje z zlib na jeszcze innym komputerze, więc nie jest to problem GMP specyficzne.

EDIT: Mam zerwane ghc --info z każdej z maszyn, tutaj są one dla machine one i machine two. I tutaj jest the diff między nimi.

EDIT: mam ponownie zainstalować na maszynie dwa GHC przez binarną dystrybucję, a na pewno wystarczy libgmp jest nie dynamicznie powiązane kiedy skompilować mój binarny. Wygląda więc na to, że wiąże się to z instalacją GHC przez Homebrew.

Ciągle bardzo interesuje to, co się dzieje.

+0

Myślę, że może to częściowo zależeć od sposobu kompilacji GHC. Czy dwie używane przez ciebie dystrybucje zostały skompilowane inaczej? – dfeuer

+0

Podobne pytanie: [(link)] (http://stackoverflow.com/questions/10539857/statically-link-gmp-to-an-haskell-application-using-ghc-llvm), które może pomóc. – ErikR

+0

@dfeuer GHC był rzeczywiście zainstalowany inaczej - przez binarny vs przez Homebrew - ale nie mogę znaleźć żadnych informacji, czego się spodziewać w obu przypadkach. @ user5402 Rozumiem, że nie można przekazać statycznych flag linkujących na OS X, ponieważ nie ma możliwości statycznego połączenia 'libSystem' i' libiconv'. – jtobin

Odpowiedz

1

Zasadniczą różnicą jest to, że maszyna nr 2 ma /usr/local/lib w ścieżce łącznika i używa łącznika zaparzacza (/usr/local/Library/ENV/4.3/ld). ghc nadal używa zewnętrznego linkera, nawet jeśli nie używa backendu C do generowania kodu, więc możesz łączyć kod Haskella z kodem napisanym w innych językach (kluczowym dla wielu powiązań Fask w Haskell z bibliotekami innych firm). Więc naprawdę powinieneś pytać ludzi, dlaczego rzeczy łączą się inaczej. W rzeczywistości nie jest to numer ghc.