Haskell 在i386 macbook(雪豹)上使用cabal readline软件包

Haskell 在i386 macbook(雪豹)上使用cabal readline软件包,haskell,osx-snow-leopard,readline,cabal,Haskell,Osx Snow Leopard,Readline,Cabal,我正在尝试用雪豹在i386 MacBook上构建并安装readline 我已采取以下步骤: download and extract readline-6.0.tar.gz ./configure make everything sudo make install 我检查了这些示例,它们看起来很有效(例如,rltest支持历史)。 这是 文件libreadline.6.0.dylib: libreadline.6.0.dylib: Mach-O 64-bit dynamically linke

我正在尝试用雪豹在i386 MacBook上构建并安装readline

我已采取以下步骤:

download and extract readline-6.0.tar.gz
./configure
make everything
sudo make install
我检查了这些示例,它们看起来很有效(例如,rltest支持历史)。 这是 文件libreadline.6.0.dylib:

libreadline.6.0.dylib: Mach-O 64-bit dynamically linked shared library x86_64
我希望它是i386,但是如果这些例子有效的话

然后,我从cabal安装了readline软件包,包括以下内容:

cabal install readline --reinstall --configure-option=--with-readline-includes="/usr/local/include" --configure-option=--with-readline-libraries="/usr/local/lib"
它似乎可以工作:请注意,如果没有配置选项,安装将失败。我已经使用--reinstall标志强制重新安装,因为我已经做了很多尝试

这是阴谋集团信息的输出:

$ cabal info readline
* readline         (library)
    Synopsis:      An interface to the GNU readline library
    Latest version available: 1.0.1.0
    Latest version installed: 1.0.1.0
    Homepage:      [ Not specified ]
    Bug reports:   [ Not specified ]
    Description:   More information on readline can be found at
                   http:\/\/www.gnu.org\/directory\/readline.html.
    License:       GPL
    Maintainer:    libraries@haskell.org
    Source repo:   [ Not specified ]
    Flags:         split-base
    Dependencies:  base >=3, process -any, base <3
    Documentation: [ Not installed ]
    Cached:        Yes
    Modules:
        System.Console.Readline
        System.Console.SimpleLineEditor
$cabal信息读取线
*读线(图书馆)
简介:GNU readline库的接口
最新版本:1.0.1.0
已安装的最新版本:1.0.1.0
主页:[未指定]
错误报告:[未指定]
说明:有关readline的更多信息,请访问
http:\/\/www.gnu.org\/directory\/readline.html。
许可证:GPL
维护者:libraries@haskell.org
来源回购:[未指定]
旗帜:分裂基地
依赖项:base>=3,进程-任意,base import System.Console.Readline
Prelude System.Console.Readline>do{Readline“Prompt”}
正在加载程序包syb。。。链接。。。完成。
正在加载程序包base-3.0.3.1。。。链接。。。完成。
正在加载包文件路径-1.1.0.2。。。链接。。。完成。
正在加载包old-locale-1.0.0.1。。。链接。。。完成。
正在加载包旧版-1.0.0.2。。。链接。。。完成。
正在加载unix-2.3.2.0包。。。链接。。。完成。
正在加载包目录-1.0.0.3。。。链接。。。完成。
加载包过程-1.0.1.1。。。链接。。。完成。
正在加载程序包readline-1.0.1.0。。。链接…:
/Users/macbook/.cabal/lib/readline-1.0.1.0/ghc-6.10.4/HSreadline-1.0.1.0.o:未知符号“\u rl\u basic\u quote\u characters”
ghc:无法加载包“readline-1.0.1.0”
令人惊讶的是,我也无法构建依赖readline(如JHC)的包

你能给我指一下正确的方向吗?如果你需要其他信息,请告诉我


提前感谢。

尝试使用外部库是Haskell目前最大的难点之一。社区正在进行这方面的工作,但现实情况是,大多数Haskell程序员都是学生和教授,在各种Unice、Mac和Windows设备之间维护健壮的安装过程是一项繁重的工作,在这种工作中,你真的需要一家有钱的公司才能取得成果。(想想Sun的Java…)

在使用GTK和OpenGL经历了足够多的痛苦之后,我很快得出结论,使用Haskell最愉快的方式就是坚持使用Linux。我可以避免百分之九十的痛苦,如果我只是启动到Ubuntu

也就是说,如果您尝试以下操作,可能会得到更多信息:

ghc --make TestReadline.hs
其中TestReadline.hs只是测试库的存在,就像您现在使用GHCi所做的那样:

main = do { readline "Prompt" }
您可能还想向readline的.cabal文件添加一些标志,这些标志可能会帮助您解决问题:额外的库、额外的ghci库和ld选项。这是一些非常简洁的文档。你可以通过谷歌找到更好的

如果所有这些都失败了,Haskell的IRC频道将非常有用

但是真的,有什么理由Haskell的标准IO不适合您吗?你知道,像这样的(抄袭自《真实世界哈斯克尔》第186页)

main=do
你叫什么名字

inpStr我发现以下程序对我非常有效。我希望它能为将来的参考服务

正如我所怀疑的,我没有正确编译readline。这次的赠品是

1. file explicity told me that the library was 64 bit
2. as per rtperson advice, compiling a test example was illuminating: linking was failing for that.
看看输出:

ghc --make test_readline.hs 
Linking test_readline ...
ld: warning: in /usr/local/lib/libreadline.dylib, file is not of required architecture
所以我设置了用正确的体系结构编译readline,它没有正确地猜测。我只是清理了构建目录(makedistclean),然后配置为将标志-m32传递给gcc:

./configure CC="gcc -m32"
然后重建所有内容(make everything)并安装它(sudo make install)。 现在,文件类型令人鼓舞:

~ 628 $ file /usr/local/lib/libreadline.dylib 
/usr/local/lib/libreadline.dylib: Mach-O dynamically linked shared library i386
readline终于开始工作了


PS:您也可以手工构建readline-1.0.1.0包,如2009年12月29日haskell cafe邮件列表中“使用MacPorts在雪豹上配置cabal安装readline”线程所述。

我也遇到了这个困难。事实证明,您可以编译包含32位和64位版本的“fat”二进制文件,这很好地避免了这个问题。这就是苹果分发自己的库的方式,他们在本技术说明中告诉您如何做到这一点:

从基于“配置”的开源项目构建通用二进制文件

这个注释有点陈旧——它涉及到构建ppc/i386二进制文件——但是当我替换“-arch i386-arch x86_64”时,这个过程对我来说运行良好。我现在有,例如

$file libreadline.a libreadline.a:Mach-O通用二进制文件,具有2种体系结构 libreadline.a(用于架构i386):当前ar归档随机库
libreadline.a(适用于体系结构x86_64):当前ar archive random library

回答您的最后一点:我不需要它,JHC需要它:-)我会尽快尝试您的建议并让您知道。通常,
cabal
为在Haskell中安装外部库提供了极好的支持-只需在命令行提示符下键入
cabal install
,它“就可以正常工作”。但是Mac上的
readline
是有问题的,因为这个平台上的
editline
库被错误地命名为
readline
库。请不要从这个特例中得出结论。@Yitz-谢谢你对Mac问题的澄清,但在“公正工作”这一点上,你错得再错不过了。Cabal为下载到底层库的绑定提供了极好的支持,但它不安装这些库
./configure CC="gcc -m32"
~ 628 $ file /usr/local/lib/libreadline.dylib 
/usr/local/lib/libreadline.dylib: Mach-O dynamically linked shared library i386