Tag: ffi

unsafePerformIO和FFI库初始化

我正在为C中的库创建一个FFI模块,它希望在其他任何东西之前调用一次非重入函数。 这个调用是幂等的,但是有状态的,所以我可以在每个Haskell调用中调用它。 但它很慢并且由于不可重入而可能导致冲突。 那么这是使用unsafePerformIO的合适时机吗? 我可以将Bool包装在一个不安全的IORef或MVar中,通过忽略后续调用(全局隐藏IORef状态为False的调用)使这些初始化调用成为幂等的。 如果没有,这样做的正确方法是什么?

如何使用“外部function界面”从Go调用C

如何使用Go的“外部函数接口”调出C函数? 常见问题解答中提到了此界面,但我无法在文档的其他地方看到它。

在Haskell和C之间交换结构化数据

首先,我是Haskell的初学者。 我正计划将Haskell集成到C中用于实时游戏。 Haskell做逻辑,C做渲染。 要做到这一点,我必须为每个滴答(每秒至少30次)从彼此传递巨大的复杂结构数据(游戏状态)。 所以传递的数据应该是轻量级的。 该状态数据可以放在存储器上的顺序空间上。 Haskell和C部分都应该自由地访问各州的每个区域。 在最好的情况下,传递数据的成本可以是复制指向内存的指针。 在最坏的情况下,通过转换复制整个数据。 我正在阅读Haskell的FFI( http://www.haskell.org/haskellwiki/FFICookBook#Working_with_structs )Haskell代码看起来明确指定了内存布局。 我有几个问题。 Haskell可以明确指定内存布局吗? (与C结构完全匹配) 这是真正的内存布局吗? 或者需要任何类型的转换? (性能损失) 如果Q#2为真,那么当显式指定内存布局时会有任何性能损失吗? #{alignment foo}的语法是什么? 我在哪里可以找到关于此的文件? 如果我想以最佳性能传递大量数据,我该怎么做? * PS显式内存布局function,我说只是C#的[StructLayout]属性。 这是明确指定内存中位置和大小的。 http://www.developerfusion.com/article/84519/mastering-structs-in-c/ 我不确定Haskell是否具有与C struct字段匹配的语言结构。

C(非C ++)的有限域(伽罗瓦域)线性代数库

我正在为C搜索有限域/ galois域精确线性代数库(C ++是不可接受的,因为我需要能够编写一个Haskell绑定到它,而这对C ++来说显然很难 )。 我找到了类似FFLAS-FFPACK和Givaro的库,但这些是C ++ – 模板库:-( 特别是我希望能够将𝔽pn ×1和𝔽p1 ×m矩阵(向量)乘以𝔽pn ×m矩阵。 那么,有没有人知道C或“extern C”库是否合适? PS:这是关于同一事项的我的Haskell问题 。

Rust FFI将trait对象作为上下文传递给调用回调

好的,我正在努力实现以下目标: C召唤生锈 rust调用回c并在用户定义的trait对象上注册回调 c因上下文而生锈 rust调用上下文的回调(trait对象) 我一直在玩它很多。 我走得很远,但还是不太好。 C位: #include #include void *global_ctx; void c_function(void* ctx) { printf(“Called c_function\n”); global_ctx = ctx; } int main(void) { void *thing = dlopen(“thing/target/debug/libthing.dylib”, RTLD_NOW | RTLD_GLOBAL); if (!thing) { printf(“error: %s\n”, dlerror()); return 1; } void (*rust_function)(void) = dlsym(thing, “rust_function”); void (*rust_cb)(void*) = dlsym(thing, “rust_cb”); printf(“rust_function = %p\n”, rust_function); […]

使用数组参数从C调用Rust方法

我正在尝试从我的C项目中为嵌入式设备调用Rust代码。 设备在UART上打印,因此我可以看到通话结果是什么。 下面的C和Rust代码按预期工作(我省略了许多使编译时需要的样板代码)。 C: uint8_t input[] = {1,2,3}; uint8_t output[] = {4,5,6}; output = func(input, output); printf(“Sum: %d”, output[0]); 锈: #[no_mangle] pub extern fn func(input: &[u8], dst: &mut[u8]) -> u8 { 3 } 这按预期打印3。 但我坚持改变作为参考传入的数组: C: uint8_t input[] = {1,2,3}; uint8_t output[] = {4,5,6}; func(input, output); printf(“Sum: %d”, output[0]); 锈: #[no_mangle] pub extern fn func(input: […]

静态链接C库和Haskell库

我有一个Haskell项目,旨在创建一些C ++绑定。 我编写了C包装器并将它们编译成一个独立的静态链接库。 我想编写Haskell绑定以静态链接到C包装器,这样我就不必单独分发C包装器,但我似乎无法使它工作,并希望得到一些帮助。 我指定C库作为额外的库,但我的cabal build步骤似乎没有将它添加到编译命令。 我已经创建了一个小项目来说明这一点( http://github.com/deech/CPlusPlusBindings )。 它包含一个小的C ++类( https://github.com/deech/CPlusPlusBindings/tree/master/cpp-src),C包装器( https://github.com/deech/CPlusPlusBindings/tree/master/c- src ),一个工作的C测试例程( https://github.com/deech/CPlusPlusBindings/tree/master/c-test )和Haskell文件( https://github.com/deech/CPlusPlusBindings/blob/master/ src / BindingTest.chs )。 在Setup.hs中添加了C库,而不是在Cabal文件中,因为这就是我的实际项目,它是在构建步骤之前使用“make”通过Cabal构建C库的。 我已经validation在构建步骤中, extraLibs部分包含库名称, extraLibDirs包含正确的目录。 我的cabal build的输出是: creating dist/setup ./dist/setup/setup build –verbose=2 creating dist/build creating dist/build/autogen Building CPlusPlusBinding-0.1.0.0… Preprocessing library CPlusPlusBinding-0.1.0.0… Building library… creating dist/build /usr/local/bin/ghc –make -fbuilding-cabal-package -O -odir dist/build -hidir dist/build -stubdir […]

如何正确地混合C ++和C.

我遇到了一些问题:我需要为C ++库编写一个C包装器。 说我有3个文件: wrapper.h typedef struct Foo Foo; Foo* create_foo(); wrapper.cpp extern “C” { #include “wrapper.h” } #include “foo.h” Foo* create_foo() { return new Foo; } foo.h中 class Foo { public: Foo(); }; 编译好: clang++ -std=c++14 wrapper.cpp foo.h wrapper.h -shared -fPIC clang++ -shared -o libbindings.so a.out 但是在编译使用C包装器的程序时(它是编译器并通过使用包装器 – Crystal的编程语言链接),我得到一个未定义的引用create_foo()和链接器错误collect2: error: ld returned 1 exit status […]

在C中,给定变量参数列表,如何使用它们构建函数调用?

假设有一个以某种方式存储的参数列表,例如,在数组中。 给定一个函数指针 ,如何调用它来传递存储的参数列表? 我不是试图将数组作为参数传递好。 你明白了,好吗? 我想将每个元素作为参数传递。 数组只是为了说明,我可以将参数存储在一些元组结构中。 另外,看看我手头有一个函数指针,并且可能有字符串格式的签名 。 我不是只想定义一个能够处理可变列表的函数。 我看到如何做到这一点的唯一方法是使用汇编(通过__asm push et al。)或者: void (*f)(…); int main() { f = ; int args[]; int num_args = ; switch(num_args) { case 0: f(); break; case 1: f(args[0]); break; case 2: f(args[0], args[1]); break; /* etc */ } return 0; } 我不太喜欢这种做法…… 还有另一种便携式和更短的forms吗? 几种脚本语言可以调用C函数。 Python或Ruby等脚本语言如何做到这一点? 他们如何以便携方式实现它? […]