gpt4 book ai didi

haskell - 通过外部导出 ccall 暴露 Haskell 函数对于 CStrings 失败

转载 作者:行者123 更新时间:2023-12-02 14:15:07 26 4
gpt4 key购买 nike

我制作了一个简短的 Haskell 程序,它公开了 C 或 Python 的函数。已关注 http://www.haskell.org/ghc/docs/7.0.3/html/users_guide/ffi-ghc.html#ffi-library严格来说,这对于导出整数来说效果很好。

想要导出String并制作程序:

module Adder where

import CString

adder :: Int -> Int -> IO CString
adder x y = newCString(show(x+y))

foreign export ccall adder :: Int -> Int -> IO CString

当我这样做时编译没问题:ghc adder.hs但在 Windows 中链接创建 dll 时失败。

ghc -shared -o adder.dll adder.o adder_stub.o StartEnd.o

错误:adder.o:fake:(.text+0x11d): 对 `__stginit_haskell98zm1zi1zi0zi1_CString_' 的 undefined reference

StartEnd.o 是从我从 haskell.org 站点复制的 C 文件编译而来的:

#include <Rts.h>
extern void __stginit_Adder(void);
void HsStart()
{
int argc = 1;
char* argv[] = {"ghcDll", NULL}; // argv must end with NULL
// Initialize Haskell runtime
char** args = argv;
hs_init(&argc, &args);
// Tell Haskell about all root modules
hs_add_root(__stginit_Adder);
}
void HsEnd()
{
hs_exit();
}

我必须做什么才能导出字符串?

最佳答案

尝试导入Foreign.C.String而不是模块CString。 GHC 应该识别模块并链接到正确的库中。在Linux系统上,编译静态,我遇到了与您相同的问题(未定义的引用)。当我更改该导入并留下以下代码时,一切正常。

我的 Haskell 模块(导出函数):

$ cat so.hs
module Adder where

import Foreign.C.String

adder :: Int -> Int -> IO CString
adder x y = newCString(show(x+y))

foreign export ccall adder :: Int -> Int -> IO CString

我的主 C 文件(其中包括所有 init 和内联删除工作,不漂亮,但这只是教育性的):

$ cat soMain.c
#include <Rts.h>
#include "so_stub.h"

extern void __stginit_Adder(void);

void main()
{
char *str = NULL;
int argc = 1;
char* argv[] = {"ghcDll", NULL}; // argv must end with NULL
// Initialize Haskell runtime
char** args = argv;
hs_init(&argc, &args);
// Tell Haskell about all root modules
hs_add_root(__stginit_Adder);

// END INIT


str = adder(1,2);
printf("%s\n",str);

// END MAIN START THE FINALIZERS
hs_exit();


}

我的命令:

$ ghc -c so.hs
$ ghc soMain.c so_stub.o so.o -o so -fforce-recomp
$ ./so
3

编辑:只是猜测,但如果您指定 {-# LANGUAGE Haskell98,foreignFunctionInterface #-}

CString 导入可能会起作用。

关于haskell - 通过外部导出 ccall 暴露 Haskell 函数对于 CStrings 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6783106/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com