【问题标题】:Creating Haskell shared libraries on OS X在 OS X 上创建 Haskell 共享库
【发布时间】:2012-04-08 15:12:24
【问题描述】:

我正在尝试从 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)找到函数名称

任何提示都将不胜感激,我们将不胜感激提供示例 make 文件或已在 OS X 上成功构建(并使用)共享库的构建行。我对 Haskell 很陌生,不知道我是否应该继续努力,假设问题出在我的头上,或者由于各种原因,我不应该期望它在 OS X 上工作。

这里有一个包含我尝试过的所有组合的 git 存储库:https://github.com/bennoleslie/haskell-shared-example 我确实设法得到了适用于 32 位 ghc 的东西,但还不是 64 位。

【问题讨论】:

  • 不管怎样,我在 64 位 Mac OS 上的构建测试 1 - 6 中遇到了完全相同的错误。它在 Ubuntu 上为我构建和工作: $ haskell-shared-example# python test.py Blah: [ExampleStruct 50 60,ExampleStruct 50 60,ExampleStruct 50 60,ExampleStruct 50 60,ExampleStruct 50 60,ExampleStruct 50 60,ExampleStruct 50 60,ExampleStruct 50 60,ExampleStruct 50 60,ExampleStruct 50 60] 489
  • ghc 的更高版本会给出不同的错误吗?它的 ID 最高为 7.6.1 或 7.4.2
  • 我安装了最新的稳定 Haskell 平台 (2012.4.0),其中包括 ghc 7.4.2。不同的确切原因,仍然失败。虽然可能不太致命的失败。需要更多调查。
  • 感谢@Mark 让我真正尝试最新的似乎可以解决问题(请看,我只需要等待 6 个月,问题就会自行解决!)。

标签: macos haskell shared-libraries ghc


【解决方案1】:

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

调用行对我有用:

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/

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-11-27
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多