问题标签 [c2hs]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
301 浏览

haskell - 在 Windows 上使用 c2hs

我正在尝试在 Windows 上使用 libxml-enumerator 包,它(最终)需要使用 c2hs。在尝试构建相关包时,我从 c2hs 收到看似臭名昭著的“不存在”错误。这似乎与没有安装 GCC 有关,但这似乎是一个奇怪的列表,因为我已将 Haskell 的 gcc.exe 副本添加到我的路径中。

有谁知道如何打败这个错误?

0 投票
2 回答
3557 浏览

haskell - hsc2hs 和 c2hs 的区别?

hsc2hs 和 c2hs 有什么区别?

我知道什么是 hsc2hs 是一个预处理器,但它到底是做什么的?

c2hs 可以用 C 代码制作 Haskell 模块,但是我需要 hsc2hs 吗?

0 投票
2 回答
407 浏览

haskell - c2hs 未正确安装/注册

当我运行时cabal install c2hs,它似乎正确完成,但没有注册包。该软件包似乎甚至没有安装:它没有出现在 中ghc-pkg list,并且重新运行cabal install c2hs会经历相同的安装过程,而不是说“所有请求的软件包都已安装”。

我非常感谢任何帮助启动和运行它。我正在使用预构建的 GHC 7.4.1 二进制文件。

提前致谢!

0 投票
1 回答
315 浏览

haskell - 访问 C2HS 编组功能的现代方式是什么?

我想使用该cFromEnum功能,但它驻留在C2HS模块中,我被告知这是不必要的,不应解压/安装(c2hs 未正确安装/注册)。转换枚举的现代方法是什么?具体来说,这是我的代码。

get_nodes_by_type最终会争论不休;我现在只是想让一些东西起作用)。

0 投票
1 回答
168 浏览

haskell - c2hs - 匿名枚举?

c2hs 参考(又名“教程”)提到了 C 枚举的名称作为非可选参数。有没有办法让它与匿名枚举一起工作?仅给定一个枚举成员就可以确定要生成的枚举,或者即使不可能,至少应该可以通过显式命名枚举成员来生成枚举。

澄清:

给定一个枚举

我想要一些类似的东西

0 投票
1 回答
504 浏览

haskell - 无法使用“外国”指针获得 C2HS 工作

一般信息

我目前正在试验 Haskell 的 C->Haskell (C2HS) 接口生成器。乍一看,这真是太棒了,我extern C在短短几个小时内就连接了一个相当复杂的 C++ 库(使用一个小的 -wrapper)。(而且我以前从未做过任何 FFI。)

只有一个问题:如何释放 C/C++ 库中分配的内存?我{#pointer ... foreign #}C2HS 文档中找到了,这看起来与我所追求的完全一样。由于我的 C-wrapper 将 C++ 库转换为具有引用透明性和功能接口的库,因此 Haskell 存储管理器应该能够为我完成艰苦的工作:-)。不幸的是,我无法让这个工作。为了更好地解释我的问题,我在 GitHub 上建立了一个小型演示项目,它与 C/C++ 库+包装器具有相同的属性,但没有开销。如您所见,该库与pure unsafeFFI 一起使用是完全安全的。

演示项目

在 GitHub 上,我创建了一个小型演示项目,组织如下:

C 库

C 库非常简单且无用:您可以将整数传递给它,然后可以[0..n]从库中获取尽可能多的整数(当前)。记住:这个库没用,只是一个演示。该接口也非常简单:该函数LTIData lti_new_data(int n)将(在传递一个整数之后)返回某种不透明的对象,其中包含 C 库的已分配数据。该库还有两个访问器函数int lti_element_count(LTIData data)int lti_get_element(LTIData data, int n)前者将返回元素的数量,后者将返回元素n。啊,最后但并非最不重要的一点是,图书馆的用户应该在使用它之后释放不透明LTIDatavoid lti_free_data(LTIData data).

低级 Haskell 绑定

低级 Haskell 绑定是使用 C2HS 设置的,您可以在

高级 Haskell API

为了好玩,我还设置了一种使用低级 API 绑定的高级 Haskell API和一个使用高级 API 的简单驱动程序。使用驱动程序和例如 valgrind 可以很容易地看到泄漏的内存(对于每个参数p_1, p_2, ..., p_n,库都会进行\sum_{i = 1..n} 1 + p_i分配;如下所示很容易观察到):

演示的当前状态

您应该能够通过简单地键入来克隆、编译和运行项目git clone https://github.com/weissi/c2hs-experiments.git && cd c2hs-experiments && cabal configure && cabal build && dist/build/TestHsLTI/TestHsLTI

那么又是什么问题呢?

问题是该项目只使用而不是使用 C2HS 的Foreign.Ptr“托管”版本,我无法让它工作。在演示项目中,我还添加了一个文件,尝试使用这些外部指针,但它不起作用:-(。我非常努力地尝试,但没有成功。Foreign.ForeignPtr{#pointer ... foreign #}.chs

还有一件事我也不明白:如何使用 C2HS 告诉 GHC 如何释放图书馆的数据。演示项目的库提供了一个函数void lti_free_data(LTIData data),应该调用它来释放内存。但是GHC猜不到!?!如果 GHC 使用常规 a free(),则并非所有内存都会被释放:-(。

0 投票
1 回答
735 浏览

haskell - 如何使用 char* 类型的参数将 NULL 传递给外部函数?

我正在为某个 C 项目编写 Haskell 绑定,并且有一个类型的函数

问题是foo检查这个指针的NULL值并做一些不同于正常行为的事情。在我的 Haskell 源代码包装器中,此函数具有类型foo :: String -> IO ()并使用newCStringinside 来编组它的参数。

我想知道我如何在NULL那里给用户能力通行证?从那以后,我一直期待这newCString ""会给我,但事实并非如此。0"" /= "\0"

我现在看到的唯一方法是使用“”作为用户想要的指示符NULL,但这似乎很骇人听闻。我期待这个问题很常见,但没有找到关于 SO 的问题。

0 投票
2 回答
224 浏览

haskell - Mac OS X 10.7.5 的 c2hs 安装错误

我正在尝试使用cabal install c2hs. 我创建~/.cabal/bin了预先安装二进制文件。

使用命令cabal install c2hs获取错误。

安装有什么问题?ghc 版本是 7.6.3。

0 投票
1 回答
263 浏览

haskell - 使用 c2hs 编组 void*

我的 C 函数如下所示:

我的.chs文件如下所示:

这是我得到的错误:

Ptr ()我在 c2hs 文档中找不到任何关于 void 指针 ( ) 的提及。我该如何编组这个?

0 投票
1 回答
196 浏览

haskell - c2hs:绑定常量

我正在尝试使用 c2hs 编写与某些 ioctl 函数(特别是获取和设置窗口大小)的快速绑定。这是我所拥有的相关部分:

(完整代码可在https://gist.github.com/nc6/8977936获得)

当我尝试编译它时,我得到:

c2hs:尚未实现功能:GenBind.evalConstCExpr:尚未实现强制转换。

我猜这个问题的原因是 C consts 是使用Haskell 预处理器无法处理的一些辅助函数 (_IOW和) 定义的。_IOR但是,目前尚不清楚如何最好地解决此问题。我尝试在一个#c ... #endc部分中定义一个枚举并使用直enum钩,但这给出了完全相同的问题。

我应该放弃使用 c2hs 并使用其他东西吗?有没有解决这个问题的明智方法,而不是简单地硬编码常量值?