【发布时间】:2017-01-23 04:04:28
【问题描述】:
我正在尝试将 OpenCV 与 Haskell 一起使用。我的想法是从 Haskell 调用 c++ 函数。
现在我正在这样做:
{-# LANGUAGE ForeignFunctionInterface #-}
module Lib
(
someFunc
) where
import Foreign.C
import Foreign.C.String
import Foreign.C.Types
import Foreign.Ptr
data LplROI = LplROI {
coi :: CInt,
xOffset :: CInt,
yOffset :: CInt
}
data LpImage = LpImage {
align :: CInt,
alphaChannel :: CInt,
borderConst :: CInt,
borderMode :: CInt,
channelSeq :: CChar,
colorModel :: CChar,
dataOrder :: CInt,
depth :: CInt,
height :: CInt,
id :: CInt,
imageData :: CChar,
mageDataOrigin :: CChar,
imageId :: CChar,
imageSize :: CInt,
maskROI :: LpImage,
nChannels :: CInt,
nSize :: CInt,
origin :: CInt,
roi :: LplROI,
tileInfo :: CChar,
width :: CInt,
widthStep :: CInt
}
foreign import ccall "_ZN2cv6imreadERKNS_6StringEi" imRead_ImRead :: CString -> CInt -> IO (Ptr LpImage)
someFunc = do
filename <- newCString "/home/chuck/Pictures/such-a-bad-day.jpg"
imRead_ImRead filename 1
我读了这篇帖子CPlusPlus from Haskell,所以我得到了这个名字_ZN2cv6imreadERKNS_6StringEi。在 2.1.1 中找到被损坏的命名。
但是 GHCi 说:
ByteCodeLink:找不到标签 在交互式链接期间,GHCi 找不到以下符号: _ZN2cv6imreadERKNS_6StringEi
在 Python 中我应该“导入 cv2”,但我不知道它在 Haskell 上是如何工作的。
我还阅读了:FFI cook book 但我无法在那里得到我的问题的答案。
有什么想法吗?
【问题讨论】:
-
你如何告诉 GHCi 在哪些库中搜索这个符号?
-
这是个好问题。我不知道。我在这里看不到:CPlusPlus from Haskell 他在哪里做的。我想也许在阴谋集团文件中。像这样:
library hs-source-dirs: src exposed-modules: Lib build-depends: base >= 4.7 && < 5 default-language: Haskell2010带有 ghci 选项,但我不确定。 -
如果您有 cabal 文件,请尝试使用
cabal repl而不是ghci。 Cabal 应该告诉 ghci 使用哪些库。 -
我尝试了
cabal repl和stack repl,但我仍然遇到同样的错误。我应该在哪里指定库? @n.m. -
我建议尝试使用现有的 OpenCV 绑定,例如 github.com/LumiGuide/haskell-opencv。