Ответ 1
Начальные вопросы
Должно ли это работать с 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
libs с помощью предоставленного Makefile
и дополнительно использовал ваш файл .cabal
для обработки src/Graphics/UI/GLFW.hsc
и сборки dist/build/Graphics/UI/GLFW.hs
(т.е. ранее я запускал cabal configure/build
).
Могу ли я обойтись со статической версией .a библиотеки с ghci?
Да, поддержка загрузки статических библиотек была включена в GHC 7.0.2 (Руководство GHC). 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
вы пытаетесь создать конфликтующие библиотеки два:
- 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>