C2HS生成的C绑定中的链接器错误



我用C->Haskell Compiler, version 0.25.2 Snowboundest, 31 Oct 2014 build platform is "x86_64-darwin" <1, True, True, 1>;构建命令:

c2hs Structs.chs
ghci Structs.hs

但是链接器抱怨

During interactive linking, GHCi couldn't find the following symbol: get_foo

问:为什么会出现这种情况,我该如何解决?Thx提前

A:tl;我没有把.c编译成.o对象代码,DUH!

代码如下:

结构.chs

module Main where
import Foreign
import Foreign.C
#include "Structs.h"
{#pointer *foo as Foo#}
{#fun get_foo {`Int'} -> `Foo' return* #}
main :: IO ()
main = do
  foo <- get_foo 3
  a1 <- {#get struct foo->a#} foo
  print a1

结构.h

struct foo {
  int a;
};
struct foo *get_foo(int n);

结构.c

#include "Structs.h"
struct foo f;
struct foo *get_foo(int n)
{
  f.a = n;
  return &f;
}

结构.hs

-- -- C2HS generated Hs file, edited for clarity
module Main where
import Foreign
import Foreign.C
type Foo = Ptr ()
get_foo :: Int -> IO Foo
get_foo p =
  get_foo'_ (fromIntegral p)
main :: IO ()
main = do
  foo <- get_foo 3
  a1 <- (ptr -> peekByteOff ptr 0 :: IO CInt) foo
  print a1
foreign import ccall safe "Structs.chs.h get_foo"
  get_foo'_ :: CInt -> IO Foo

EDIT:ghc --make Structs.hs给出相同的链接器错误:

$ ghc --make Structs.hs
Linking Structs1a ...
Undefined symbols for architecture x86_64:
"_get_foo", referenced from:
    _c2MX_info in Structs.o
    _c2Or_info in Structs.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

get_foo C函数是在Structs.c中定义的,因此您需要将其提供给GHC。这应该有效:

gcc -o Structs_c.o -c Structs.c
ghc --make Structs.hs Structs_c.o

对于GHCi,我想你可以说ghci Structs.hs Structs_c.o。但是你肯定需要C对象文件!