использование пакета Cabal Readline на MacBook i386 (снежный барс)
-
22-09-2019 - |
Вопрос
Я пытаюсь собрать и установить readline на MacBook i386 со Snow Leopard.
Я сделал следующие шаги:
download and extract readline-6.0.tar.gz
./configure
make everything
sudo make install
Я проверил примеры, и они, похоже, работают (например, rltest поддерживает историю).Это выход File libreadline.6.0.dylib:
libreadline.6.0.dylib: Mach-O 64-bit dynamically linked shared library x86_64
Я ожидал, что это будет i386, но если примеры сработают...
затем я установил пакет readline из cabal со следующим:
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).
Можете ли вы указать мне правильное направление?Скажите мне, если вам нужна другая информация.
Заранее спасибо.
Решение
Я нашел следующую процедуру, которая мне очень помогла.Я надеюсь, что это может послужить для дальнейшего использования.
Как я и подозревал, я неправильно компилировал 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 с правильной архитектурой, он не правильно угадал.Я просто очистил каталоги сборки (сделайте 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 наконец-то работает.
ПС:вы также можете собрать пакет readline-1.0.1.0 вручную, как подробно описано в теме «Настройка строки чтения cabal install на Snow Leopard с MacPorts» в списке рассылки haskell-cafe от 29 декабря 2009 г.
Другие советы
Я тоже столкнулся с этой трудностью.Оказывается, вы можете компилировать «толстые» двоичные файлы, содержащие как 32-, так и 64-битные версии, что очень хорошо обходит эту проблему.Вот как Apple распространяет свои собственные библиотеки, и они расскажут вам, как это сделать, в этой технической заметке:
Создание универсальных двоичных файлов из проектов с открытым исходным кодом, основанных на настройке.http://developer.apple.com/library/mac/#technotes/tn2005/tn2137.html
Примечание немного устарело - оно относится к сборке двоичных файлов ppc/i386 - но у меня процедура сработала нормально, когда я заменил "-arch i386 -arch x86_64".Теперь у меня есть, например,
$ file libreadline.a libreadline.a:Mach-O Universal Binary с 2 архитектурами LibReardLine.A (для архитектуры i386):Текущий архив AR Архив случайный библиотека libreadline.a (для архитектуры x86_64):текущий архив случайной библиотеки
Попытка работать с внешними библиотеками — одна из самых больших проблем в Haskell на данный момент.Сообщество работает над этим, но реальность такова, что большинство программистов на Haskell — студенты и профессора, и поддержание надежных процедур установки между различными Unix, Mac и Windows — это своего рода тяжелая работа, где вам действительно нужна корпорация с деньгами на линию, чтобы получить результат.(Подумайте о Sun с Java...)
Почувствовав достаточное количество проблем с GTK и OpenGL, я быстро прихожу к выводу, что самый приятный способ работать с Haskell — это придерживаться Linux.Я могу избежать девяноста процентов боли, если просто загрузлюсь в Ubuntu.
Тем не менее, вы можете получить более информативную ошибку, если попробуете следующее:
ghc --make TestReadline.hs
Где TestReadline.hs просто проверяет наличие библиотеки, как вы сейчас делаете с GHCi:
main = do { readline "Prompt" }
Есть также несколько флагов, которые вы можете добавить в файл .cabal readline, которые могут вам помочь:дополнительные библиотеки, дополнительные библиотеки-ghci и ld-options. Здесь это довольно краткая документация.Вы можете найти лучшее через Google.
Если ничего не помогает, IRC-канал Haskell очень полезен.
Но действительно, есть ли какая-то причина, по которой стандартный ввод-вывод Haskell вам не подходит?Знаете, что-то вроде этого (записано со стр. 186 Реальный мир Haskell)?
main = do
putStrLn "What's your name?"
inpStr <- getLine
putStrLn $ "Welcome, " ++ inpStr ++ "!"