我想知道C头文件和ABI如何相关 . 各种类型的大小是体系结构,甚至依赖于编译器 . 那么如何可靠地链接到C库?
对于更具体的问题:当使用Haskell的FFI时,甚至只使用像 CDouble 这样的Haskell类型来定义(复制C库接口的定义) . 我不知道二进制类型大小信息来自何处 . 使链接起作用的诀窍是什么?
CDouble
库类型信息来自魔术宏,用于插入由autoconf从C编译器中获取的信息 .
例如,请在此处查看 CDouble 的定义:https://hackage.haskell.org/package/base-4.8.2.0/docs/src/Foreign.C.Types.html#CDouble
然后在此autoconf输入中查看 HTYPE_DOUBLE 大小的来源:https://hackage.haskell.org/package/base-4.8.2.0/src/include/HsBaseConfig.h.in
HTYPE_DOUBLE
由于GHH针对编译器/ arch进行编译,因此编译它(除了在特殊的交叉编译器模式中,这些模式是新的,并且我不能完全认识到不同)这使得所有内容都与ABI正确绑定 .
请看这个链接https://code.google.com/p/tabi
它可以帮助您避免Haskell和C之间可能的ABI差异的困难 .
2 回答
库类型信息来自魔术宏,用于插入由autoconf从C编译器中获取的信息 .
例如,请在此处查看
CDouble
的定义:https://hackage.haskell.org/package/base-4.8.2.0/docs/src/Foreign.C.Types.html#CDouble然后在此autoconf输入中查看
HTYPE_DOUBLE
大小的来源:https://hackage.haskell.org/package/base-4.8.2.0/src/include/HsBaseConfig.h.in由于GHH针对编译器/ arch进行编译,因此编译它(除了在特殊的交叉编译器模式中,这些模式是新的,并且我不能完全认识到不同)这使得所有内容都与ABI正确绑定 .
请看这个链接https://code.google.com/p/tabi
它可以帮助您避免Haskell和C之间可能的ABI差异的困难 .