我正在尝试使用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)。
你能指出我正确的方向吗?如果您需要其他信息,请告诉我。提前致谢。
答案 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 ++ "!"