3

我正在尝试在带有 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"

它似乎有效:请注意,如果没有配置选项,安装将失败。我已经使用了 --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)。

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

提前致谢。

4

3 回答 3

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,它没有正确猜测。我只是清理了构建目录(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 邮件列表中的“Configuring cabal install readline on Snow Leopard with MacPorts”线程。

于 2010-01-04T00:00:09.433 回答
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 存档随机库

于 2010-10-09T18:48:43.693 回答
1

尝试使用外部库是目前 Haskell 中最大的痛点之一。社区正在努力,但现实情况是大多数 Haskell 程序员都是学生和教授,在各种 Unices、Mac 和 Windows 机器之间维护健壮的安装程序是一种繁重的工作,你真的需要有钱的公司线才能得到结果。(想想 Sun 与 Java...)

在体验了 GTK 和 OpenGL 的痛苦之后,我很快得出结论,使用 Haskell 最愉快的方式就是坚持使用 Linux。如果我简单地启动到 Ubuntu,我可以避免 90% 的痛苦。

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

ghc --make TestReadline.hs

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

main = do { readline "Prompt" }

您可能还想将一些标志添加到 readline 的 .cabal 文件中,这些标志可能会对您有所帮助:extra-libraries、extra-ghci-libraries 和 ld-options。是一些非常简洁的文档。你可以通过谷歌找到更好的。

如果一切都失败了,Haskell 的 IRC 频道非常有帮助。

但实际上,Haskell 的标准 IO 有什么理由不适合你吗?你知道,像这样的东西(摘自Real World Haskell的第 186 页)?

main = do 
   putStrLn "What's your name?"
   inpStr <- getLine
   putStrLn $ "Welcome, " ++ inpStr ++ "!"
于 2009-12-30T21:34:39.003 回答