Haskell 编译FFI示例时,libHSghc prim出现未定义的符号错误

Haskell 编译FFI示例时,libHSghc prim出现未定义的符号错误,haskell,gcc,compilation,linker,ghc,Haskell,Gcc,Compilation,Linker,Ghc,我试图在中编译示例代码,我可以使用另一台计算机很好地编译: Foo.hs module Foo where foreign export ccall foo :: Int -> IO Int foo :: Int -> IO Int foo n = return (length (f n)) f :: Int -> [Int] f 0 = [] f n = n:(f (n-1)) Foo.c #include <stdio.h> #include "HsFF

我试图在中编译示例代码,我可以使用另一台计算机很好地编译:

Foo.hs

module Foo where

foreign export ccall foo :: Int -> IO Int

foo :: Int -> IO Int
foo n = return (length (f n))

f :: Int -> [Int]
f 0 = []
f n = n:(f (n-1))
Foo.c

#include <stdio.h>
#include "HsFFI.h"

#ifdef __GLASGOW_HASKELL__
#include "Foo_stub.h"
#endif

int main(int argc, char *argv[])
{
  int i;

  hs_init(&argc, &argv);

  for (i = 0; i < 5; i++) {
    printf("%d\n", foo(2500));
  }

  hs_exit();
  return 0;
}
但是当运行
a.out
时,我得到了错误“/a.out:symbol lookup error:/usr/lib/ghc-8.4.3/ghc-prim-0.5.2.0/libHSghc-prim-0.5.2.0-ghc8.4.3.so:未定义的符号:stg_traceMarkerzh” 在编译其他简单的FFI代码时,我在libHSghc prim中遇到了关于其他未定义符号的错误

如果运行objdump-t libHSghc-prim-0.5.2.0-ghc8.4.3。因此,我会看到符号表中没有符号。收到错误后,我在Arch Linux存储库中将GHC从8.4.2更新为8.4.3,并将libHSghc prim从版本0.5.0.0更新为0.5.2.0,因此我假设这些新安装的文件是有序的。如何解决此问题

ldd libHSghc-prim-0.5.2.0-ghc8.4.3.so

linux-vdso.so.1 (0x00007ffc9e7a4000)
/lib/$LIB/liblsp.so => /lib/lib/liblsp.so (0x00007ff31abdf000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007ff31a84a000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007ff31a48e000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007ff31a28a000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007ff31b272000)

我找到了解决办法。由于Arch Linux repositories中的ghc版本使用动态链接,这使得可执行文件的大小更小,而且也更安全,因此我必须使用动态链接编译我的程序,因此我只需添加一个标志:

ghc -dynamic -no-hs-main Foo.c libfoo.so
ghc -dynamic -no-hs-main Foo.c libfoo.so