编译二进制文件时,我观察到两台计算机之间的链接行为不同。
每个文件都有相同的GHC(7.8.3),相同的代码,相同的标志(-Wall -O2
),相同的libgmp(由Homebrew在每个文件上安装):
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
在第二台机器上动态链接。
关于差异,我已经能够识别:GHC是通过OS X的二进制发行版在第一台计算机上安装的,而Homebrew在第二台计算机上安装的。对于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
从每台机器上拔了,这里它们分别是第一台机器和第二台机器。这也是两者之间的区别。
编辑:我已经通过分发二进制文件在机器2上重新安装了ghc,并且当我重新编译二进制文件时,确保没有足够libgmp
的动态链接。因此,这似乎与通过Homebrew安装GHC有关。
仍然对正在发生的事情非常感兴趣。
关键区别在于2号机器/usr/local/lib
位于链接器路径中,并且正在使用brew的链接器(/usr/local/Library/ENV/4.3/ld
)。ghc
即使未使用C后端进行代码生成,它仍然使用外部链接器,因此您可以将Haskell代码与用其他语言编写的代码结合在一起(对于Haskell与第三方库的许多FFI绑定而言,这是至关重要的)。因此,您应该真正问酿酒人为什么事情之间的联系有所不同。这实际上不是ghc
问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句