использование пакета Cabal Readline на MacBook i386 (снежный барс)

StackOverflow https://stackoverflow.com/questions/1979612

Вопрос

Я пытаюсь собрать и установить 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 ++ "!"
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top