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

时间:2009-12-30 11:03:30

标签: haskell osx-snow-leopard readline cabal

我正在尝试使用Snow Leopard在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"

它似乎工作:请注意,如果没有configure-options安装失败。我使用了--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

好吧,好像我已经完成了。不,我不是:

GHCi, version 6.10.4: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
Prelude> import System.Console.Readline
Prelude System.Console.Readline> do { readline "Prompt" }
Loading package syb ... linking ... done.
Loading package base-3.0.3.1 ... linking ... done.
Loading package filepath-1.1.0.2 ... linking ... done.
Loading package old-locale-1.0.0.1 ... linking ... done.
Loading package old-time-1.0.0.2 ... linking ... done.
Loading package unix-2.3.2.0 ... linking ... done.
Loading package directory-1.0.0.3 ... linking ... done.
Loading package process-1.0.1.1 ... linking ... done.
Loading package readline-1.0.1.0 ... linking ... <interactive>: 
/Users/macbook/.cabal/lib/readline-1.0.1.0/ghc-6.10.4/HSreadline-1.0.1.0.o: unknown symbol `_rl_basic_quote_characters'
ghc: unable to load package `readline-1.0.1.0'

不可思议的是,我也无法构建依赖于readline的包(例如JHC)。

你能指出我正确的方向吗?如果您需要其他信息,请告诉我。

提前致谢。

3 个答案:

答案 0 :(得分:2)

我发现以下程序对我来说非常有效。我希望它可以供将来参考。

我怀疑,我没有正确编译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,它没有正确猜测。我只是清理了构建dirs(make distclean),然后配置将标志-m32传递给gcc:

./configure CC="gcc -m32"

然后重建所有内容(制作所有内容)并安装它(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配置Snow Leopard上的cabal安装读取线”。

答案 1 :(得分:2)

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

从“基于配置”的开源项目构建通用二进制文件 http://developer.apple.com/library/mac/#technotes/tn2005/tn2137.html

该注释有点旧 - 它与构建ppc / i386二进制文件有关 - 但当我替换“-arch i386 -arch x86_64”时,该程序对我来说很好。我现在有,例如,

$ file libreadline.a libreadline.a:具有2个体系结构的Mach-O通用二进制文件 libreadline.a(用于体系结构i386):当前的ar归档随机库 libreadline.a(对于体系结构x86_64):当前的ar归档随机库

答案 2 :(得分:1)

尝试使用外部库是Haskell目前最大的痛点之一。社区正在努力,但现实是大多数Haskell程序员都是学生和教授,并且在各种Unices,Mac和Windows框之间维护强大的安装程序是一种笨拙的工作,你真正需要有钱的公司该行以获得结果。 (用Java思考Sun ......)

通过GTK和OpenGL感受到足够的痛苦,我很快就得出结论,使用Haskell最愉快的方法就是坚持使用Linux。如果我简单地启动到Ubuntu,我可以避免百分之九十的痛苦。

也就是说,如果你尝试下面的话,你可能会得到更多信息:

ghc --make TestReadline.hs

TestReadline.hs只是测试库的存在,就像你现在使用GHCi一样:

main = do { readline "Prompt" }

还有一些标志可能要添加到readline的.cabal文件中,可以帮助你:extra-libraries,extra-ghci-libraries和ld-options。 Here是一些非常简洁的文档。您可以通过Google找到更好的信息。

如果所有其他方法都失败了,Haskell的IRC频道非常有用。

但实际上,有什么理由说Haskell的标准IO对你不起作用吗?你知道,这样的事情(来自 Real World Haskell 的第186页)?

main = do 
   putStrLn "What's your name?"
   inpStr <- getLine
   putStrLn $ "Welcome, " ++ inpStr ++ "!"