編譯二進制文件時,我觀察到兩臺機器之間的不同鏈接行爲。什麼決定了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 one和machine two。這兩者之間的the diff也是如此。
編輯:我已經通過了二進制分發重新安裝機器兩個在GHC,果然libgmp
是不當我重新編譯的二進制我的動態鏈接。所以這似乎與通過Homebrew安裝GHC有關。
對於究竟發生了什麼仍然很感興趣。
我想這可能部分取決於GHC是如何編譯的。你使用的兩個發行版可能是以不同的方式編譯的嗎? – dfeuer 2014-12-05 20:07:02
類似的問題:[(link)](http://stackoverflow.com/questions/10539857/statically-link-gmp-to-an-haskell-application-using-ghc-llvm)這可能會有所幫助。 – ErikR 2014-12-05 20:07:21
@dfeuer GHC確實以不同的方式安裝 - 通過二進制與通過自制軟件 - 但我無法找到任何信息,無論在哪種情況下, @ user5402我知道無法傳遞OS X上的靜態鏈接標誌,因爲無法靜態鏈接libSystem和libiconv。 – jtobin 2014-12-05 20:44:11