在OS X上创建Haskell共享库

时间:2012-03-24 06:43:09

标签: macos haskell shared-libraries ghc

我正在尝试从Haskell源代码创建一个共享库。

我试过按照这里的指示:http://weblog.haskell.cz/pivnik/building-a-shared-library-in-haskell/但我没有运气。

当我使用Haskell 64位(2011.4.0.0中的ghc 7.0.4)编译时,我收到以下错误:

ld: pointer in read-only segment not allowed in slidable image, used in 
                 ___gmpn_modexact_1c_odd 

作为替代方案,我也尝试了32位版本,并且根据我用来链接的确切标记获取错误,例如:

Library not loaded: /usr/local/lib/ghc-7.0.4/base-4.3.1.0/libHSbase-4.3.1.0-ghc7.0.4.dylib

我确实设法通过将-lHSrts添加到链接器行来进一步了解。这让我成功地链接和加载了库,但是我无法使用dlsym找到函数名(或者手动使用nm | grep)

任何提示都将非常感激,一个示例生成文件,或在OS X上成功构建(和使用)共享库的构建行将不胜感激。我对Haskell很新,并且不知道我是否应该继续敲打我的脑袋,假设问题在我的最后,或者出于各种原因我不应该期望这在OS X上工作。

我尝试过的所有组合的git repo都可以在这里找到:https://github.com/bennoleslie/haskell-shared-example我确实设法为32位ghc工作,但不是64位。

2 个答案:

答案 0 :(得分:9)

可以在64位OS X上创建工作共享库,使用最新的Haskell平台版本(2012.4 64位)

调用行适用于我:

ghc -O2 --make \
-no-hs-main -optl '-shared' -optc '-DMODULE=Test' \
-o libTest.so Test.hs module_init.c

module_init.c应该是这样的:

#define CAT(a,b) XCAT(a,b)
#define XCAT(a,b) a ## b
#define STR(a) XSTR(a)
#define XSTR(a) #a

#include <HsFFI.h>

extern void CAT(__stginit_, MODULE)(void);

static void library_init(void) __attribute__((constructor));
static void library_init(void)
{
  /* This seems to be a no-op, but it makes the GHCRTS envvar work. */
  static char *argv[] = { STR(MODULE) ".so", 0 }, **argv_ = argv;
  static int argc = 1;

  hs_init(&argc, &argv_);
  hs_add_root(CAT(__stginit_, MODULE));
}

static void library_exit(void) __attribute__((destructor));
static void library_exit(void)
{
  hs_exit();
}

这个git repo:https://github.com/bennoleslie/haskell-shared-example包含一个工作示例。

所有功劳归于此原始来源:http://weblog.haskell.cz/pivnik/building-a-shared-library-in-haskell/

答案 1 :(得分:1)

您可能想尝试使用Homebrew中的ghc端口 - https://github.com/mxcl/homebrew/blob/master/Library/Formula/ghc.rb