问题标签 [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.
haskell - 在 Windows 上使用 c2hs
我正在尝试在 Windows 上使用 libxml-enumerator 包,它(最终)需要使用 c2hs。在尝试构建相关包时,我从 c2hs 收到看似臭名昭著的“不存在”错误。这似乎与没有安装 GCC 有关,但这似乎是一个奇怪的列表,因为我已将 Haskell 的 gcc.exe 副本添加到我的路径中。
有谁知道如何打败这个错误?
haskell - hsc2hs 和 c2hs 的区别?
hsc2hs 和 c2hs 有什么区别?
我知道什么是 hsc2hs 是一个预处理器,但它到底是做什么的?
c2hs 可以用 C 代码制作 Haskell 模块,但是我需要 hsc2hs 吗?
haskell - c2hs 未正确安装/注册
当我运行时cabal install c2hs
,它似乎正确完成,但没有注册包。该软件包似乎甚至没有安装:它没有出现在 中ghc-pkg list
,并且重新运行cabal install c2hs
会经历相同的安装过程,而不是说“所有请求的软件包都已安装”。
我非常感谢任何帮助启动和运行它。我正在使用预构建的 GHC 7.4.1 二进制文件。
- 阴谋集团安装输出: http: //pastebin.com/CRUii8mm
- 进口已失效: http: //pastebin.com/r0aypxRA
提前致谢!
haskell - 访问 C2HS 编组功能的现代方式是什么?
我想使用该cFromEnum
功能,但它驻留在C2HS
模块中,我被告知这是不必要的,不应解压/安装(c2hs 未正确安装/注册)。转换枚举的现代方法是什么?具体来说,这是我的代码。
(get_nodes_by_type
最终会争论不休;我现在只是想让一些东西起作用)。
haskell - c2hs - 匿名枚举?
c2hs 参考(又名“教程”)提到了 C 枚举的名称作为非可选参数。有没有办法让它与匿名枚举一起工作?仅给定一个枚举成员就可以确定要生成的枚举,或者即使不可能,至少应该可以通过显式命名枚举成员来生成枚举。
澄清:
给定一个枚举
我想要一些类似的东西
haskell - 无法使用“外国”指针获得 C2HS 工作
一般信息
我目前正在试验 Haskell 的 C->Haskell (C2HS) 接口生成器。乍一看,这真是太棒了,我extern C
在短短几个小时内就连接了一个相当复杂的 C++ 库(使用一个小的 -wrapper)。(而且我以前从未做过任何 FFI。)
只有一个问题:如何释放 C/C++ 库中分配的内存?我{#pointer ... foreign #}
在C2HS 文档中找到了,这看起来与我所追求的完全一样。由于我的 C-wrapper 将 C++ 库转换为具有引用透明性和功能接口的库,因此 Haskell 存储管理器应该能够为我完成艰苦的工作:-)。不幸的是,我无法让这个工作。为了更好地解释我的问题,我在 GitHub 上建立了一个小型演示项目,它与 C/C++ 库+包装器具有相同的属性,但没有开销。如您所见,该库与pure unsafe
FFI 一起使用是完全安全的。
演示项目
在 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
。啊,最后但并非最不重要的一点是,图书馆的用户应该在使用它之后释放不透明LTIData
的void 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()
,则并非所有内存都会被释放:-(。
haskell - 如何使用 char* 类型的参数将 NULL 传递给外部函数?
我正在为某个 C 项目编写 Haskell 绑定,并且有一个类型的函数
问题是foo
检查这个指针的NULL
值并做一些不同于正常行为的事情。在我的 Haskell 源代码包装器中,此函数具有类型foo :: String -> IO ()
并使用newCString
inside 来编组它的参数。
我想知道我如何在NULL
那里给用户能力通行证?从那以后,我一直期待这newCString ""
会给我,但事实并非如此。0
"" /= "\0"
我现在看到的唯一方法是使用“”作为用户想要的指示符NULL
,但这似乎很骇人听闻。我期待这个问题很常见,但没有找到关于 SO 的问题。
haskell - Mac OS X 10.7.5 的 c2hs 安装错误
我正在尝试使用cabal install c2hs
. 我创建~/.cabal/bin
了预先安装二进制文件。
使用命令cabal install c2hs
获取错误。
安装有什么问题?ghc 版本是 7.6.3。
haskell - 使用 c2hs 编组 void*
我的 C 函数如下所示:
我的.chs
文件如下所示:
这是我得到的错误:
Ptr ()
我在 c2hs 文档中找不到任何关于 void 指针 ( ) 的提及。我该如何编组这个?
haskell - c2hs:绑定常量
我正在尝试使用 c2hs 编写与某些 ioctl 函数(特别是获取和设置窗口大小)的快速绑定。这是我所拥有的相关部分:
(完整代码可在https://gist.github.com/nc6/8977936获得)
当我尝试编译它时,我得到:
c2hs:尚未实现功能:GenBind.evalConstCExpr:尚未实现强制转换。
我猜这个问题的原因是 C consts 是使用Haskell 预处理器无法处理的一些辅助函数 (_IOW
和) 定义的。_IOR
但是,目前尚不清楚如何最好地解决此问题。我尝试在一个#c ... #endc
部分中定义一个枚举并使用直enum
钩,但这给出了完全相同的问题。
我应该放弃使用 c2hs 并使用其他东西吗?有没有解决这个问题的明智方法,而不是简单地硬编码常量值?