Начальные вопросы
Должно ли это работать с ghci?Если так, что я делаю неправильно или как я могу исправить ошибку?
На OSX 10.6.7 (с использованием Haskell Platform / w GHC 7.0.2) я мог бы загрузить вашу встроенную общую библиотеку вghci следующим образом:
➜ GLFW-b git:(master) ✗ ghci dist/build/Graphics/UI/GLFW.hs -Lbuild/dynam
ic -lglfw
GHCi, version 7.0.2: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Loading object (dynamic) glfw ... done
final link ... done
[1 of 1] Compiling Graphics.UI.GLFW ( dist/build/Graphics/UI/GLFW.hs, inte
rpreted )
Ok, modules loaded: Graphics.UI.GLFW.
*Graphics.UI.GLFW> initialize
True
Примечание. Я собрал библиотеки glfw
, используя предоставленный вами Makefile
, и дополнительно использовал ваш файл .cabal
для обработки src/Graphics/UI/GLFW.hsc
и сборки dist/build/Graphics/UI/GLFW.hs
(т.е. яранее запускал cabal configure/build
).
Могу ли я обойтись статической версией .a библиотеки с ghci?
Да, поддержка загрузки статическогоlibs был включен в GHC 7.0.2 ( GHC Manual ).compiler/ghci/Linker.lhs
- отличное чтение, которое даст вам общее представление о том, как ghci решает, что делать с аргументами командной строки, переданными ему.Кроме того, при навигации по различным вопросам поддержки платформы я нашел эту документацию чрезвычайно полезной.
Связывание статических архивов с помощью ghci.
На момент написания строки 1113
из compiler/ghci/Linker.hs
демонстрирует, что ghci
в настоящее время требует, чтобы статическая архивация создавалась системой пакетов (то есть с именем HSlibname.a
)
locateOneObj :: [FilePath] -> String -> IO LibrarySpec
locateOneObj dirs lib
| not ("HS" `isPrefixOf` lib)
-- For non-Haskell libraries (e.g. gmp, iconv) we assume dynamic library
= assumeDll
| not isDynamicGhcLib
-- When the GHC package was not compiled as dynamic library
-- (=DYNAMIC not set), we search for .o libraries or, if they
-- don't exist, .a libraries.
= findObject `orElse` findArchive `orElse` assumeDll
Дальнейшее изучение синтаксического анализа аргумента строки cmd показывает, что указанные библиотеки собираются встрока 402
в функции reallyInitDynLinker
:
; classified_ld_inputs <- mapM classifyLdInput cmdline_ld_inputs
где classifyLdInput
определено как
classifyLdInput :: FilePath -> IO (Maybe LibrarySpec)
classifyLdInput f
| isObjectFilename f = return (Just (Object f))
| isDynLibFilename f = return (Just (DLLPath f))
| otherwise = do
hPutStrLn stderr ("Warning: ignoring unrecognised input `" ++ f ++ "'")
return Nothing
Это означает, что вне спецификации пакета в настоящее время существует нет прямого способа связать файл архива в ghci (или иначе, в настоящее время нет аргумента cmd-line для этого).
Исправление пакета cabal
В вашем.cabal
спецификация пакета, вы пытаетесь создать две конфликтующие библиотеки:
- A : ссылка в предварительно собранной библиотеке (построена согласноВаша спецификация в
Setup.hs
и Makefile
, и связана в соответствии с директивами extra-libraries
и extra-lib-dirs
) - B : создать новую встроенную библиотеку (
c-sources
иframeworks
директивы).
Простое исправление вышеуказанной ошибки - просто удалить все директивы, разрешающие B при сборке для Mac OSX, следующим образом:
include-dirs:
glfw/include
glfw/lib
- c-sources:
- glfw/lib/enable.c
- glfw/lib/fullscreen.c
- glfw/lib/glext.c
- glfw/lib/image.c
- glfw/lib/init.c
- glfw/lib/input.c
- glfw/lib/joystick.c
- glfw/lib/stream.c
- glfw/lib/tga.c
- glfw/lib/thread.c
- glfw/lib/time.c
- glfw/lib/window.c
+
+ if !os(darwin)
+ c-sources:
+ glfw/lib/enable.c
+ glfw/lib/fullscreen.c
+ glfw/lib/glext.c
+ glfw/lib/image.c
+ glfw/lib/init.c
+ glfw/lib/input.c
+ glfw/lib/joystick.c
+ glfw/lib/stream.c
+ glfw/lib/tga.c
+ glfw/lib/thread.c
+ glfw/lib/time.c
+ glfw/lib/window.c
и
if os(darwin)
- include-dirs:
- glfw/lib/cocoa
- frameworks:
- AGL
- Cocoa
- OpenGL
extra-libraries: glfw
- extra-lib-dirs: build/static build/dynamic
+ extra-lib-dirs: build/dynamic
Я не проверял ничего, кроме проверки правильности следующего:
➜ GLFW-b git:(master) ✗ ghci
GHCi, version 7.0.2: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude> :m + Graphics.UI.GLFW
Prelude Graphics.UI.GLFW> initialize
Loading package GLFW-b-0.0.2.6 ... linking ... done.
True
Prelude Graphics.UI.GLFW>