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