gpt4 book ai didi

c - 如何使用 Haskell 的 C 库?

转载 作者:太空宇宙 更新时间:2023-11-04 01:16:44 24 4
gpt4 key购买 nike

我正在尝试使用 FFI 从 Haskell 调用 C 函数,但我不断收到此错误:

ghc.exe: ^^ Could not load 'getSize', dependency unresolved. See top entry above.

main: ByteCodeLink: can't find label During interactive linking, GHCi couldn't find the following symbol: getSize This may be due to you not asking GHCi to load extra object files, archives or DLLs needed by your current session. Restart GHCi, specifying the missing library using the -L/path/to/object/dir and -lmissinglibname flags, or simply by naming the relevant files on the GHCi command line. Alternatively, this link failure might indicate a bug in GHCi. If you suspect the latter, please send a bug report to:
glasgow-haskell-bugs@haskell.org

我在我的 C 库中使用 stdio.h 库:

C 库

// lib.h
#include <stdio.h>

double getSize() {
double size = 0;
scanf("$f", &size);
return size;
}

FFI模块

{-# LANGUAGE ForeignFunctionInterface #-}
module Ffi where

import Foreign
import Foreign.C.Types

foreign import ccall "lib.h getSize" c_size :: IO Double

主要

module Main where
import Ffi

main :: IO ()
main = do a <- getLine
b <- c_size
print $ "got from C: " ++ show b

运行脚本

gcc -o lib -lib.h
runghc main

P.S. 这可能是因为我不得不在其他地方指定依赖项 stdio.h 吗?

最佳答案

好了,这里有几件事情要做:

  • 将“lib.h”重命名为“lib.c”。它是 C 源文件(包含代码),而不是 C 头文件。
  • 理想情况下,添加一个单独的“lib.h”头文件,其中包含 getSize 的原型(prototype)。
  • 修复“lib.c”中的错误。您希望用“%lf”代替“$f”以读成 double 。
  • 使用ghc 编译程序而不是使用runghc 运行程序。单个 ghc 命令可以编译和链接 Haskell 模块和 C 代码。

换句话说,您的文件应该如下所示:

// lib.c
#include "lib.h"
#include <stdio.h>
double getSize() {
double size = 0;
scanf("%lf", &size);
return size;
}
// lib.h
double getSize(void);
-- Ffi.hs
{-# LANGUAGE ForeignFunctionInterface #-}
module Ffi where
import Foreign
import Foreign.C.Types
foreign import ccall "lib.h getSize" c_size :: IO Double
-- Main.hs
module Main where
import Ffi
main :: IO ()
main = do a <- getLine
b <- c_size
print $ "got from C: " ++ show b

你应该编译它:

$ ghc Main.hs lib.c
[1 of 2] Compiling Ffi ( Ffi.hs, Ffi.o )
[2 of 2] Compiling Main ( Main.hs, Main.o )
Linking Main ...

然后您可以运行它,为 Haskell getLine 提供一行,为 C scanf 提供第二行,它应该可以正常工作:

$ ./Main
hello world!! -- line for Haskell
135.0 -- line for C
"got from C: 135.0"

关于c - 如何使用 Haskell 的 C 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56512208/

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