2014-12-05 21 views
7

編譯二進制文件時,我觀察到兩臺機器之間的不同鏈接行爲。什麼決定了OS X上GHC的鏈接行爲?

每個人都有同樣的GHC(7.8.3),同樣的代碼,相同的標誌(-Wall -O2),同樣libgmp(由家釀每個安裝):

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) 

我不能爲我的生活弄清楚爲什麼libgmp在第二臺機器上動態鏈接。

就差異而言,我已經認識到:通過第一臺機器上的binary distribution for OS X和第二臺上的Homebrew安裝了GHC。對於C編譯器,我們有:

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 

什麼通常決定鏈接行爲,以及如何執行一個鏈接方法或其他?

編輯:我發現在另一臺機器上發生了與zlib相同的行爲,所以它不是GMP特有的問題。

編輯:我彈撥從每臺機器的ghc --info,在這裏,他們是machine onemachine two。這兩者之間的the diff也是如此。

編輯:我已經通過了二進制分發重新安裝機器兩個在GHC,果然libgmp當我重新編譯的二進制我的動態鏈接。所以這似乎與通過Homebrew安裝GHC有關。

對於究竟發生了什麼仍然很感興趣。

+0

我想這可能部分取決於GHC是如何編譯的。你使用的兩個發行版可能是以不同的方式編譯的嗎? – dfeuer 2014-12-05 20:07:02

+0

類似的問題:[(link)](http://stackoverflow.com/questions/10539857/statically-link-gmp-to-an-haskell-application-using-ghc-llvm)這可能會有所幫助。 – ErikR 2014-12-05 20:07:21

+0

@dfeuer GHC確實以不同的方式安裝 - 通過二進制與通過自制軟件 - 但我無法找到任何信息,無論在哪種情況下, @ user5402我知道無法傳遞OS X上的靜態鏈接標誌,因爲無法靜態鏈接libSystem和libiconv。 – jtobin 2014-12-05 20:44:11

回答

1

關鍵的區別在於機器#2在鏈接器路徑中有/usr/local/lib,並且正在使用brew的鏈接器(/usr/local/Library/ENV/4.3/ld)。 ghc仍然使用外部鏈接器,即使它沒有使用C後端進行代碼生成,所以您可以將Haskell代碼與其他語言編寫的代碼(Haskell與第三方庫的許多FFI綁定關鍵)結合使用。所以你真的應該問釀造人爲什麼事情有不同的聯繫。這實際上不是ghc問題。

相關問題