Мне нужно создать некоторый C-код, а затем ссылаться на этот код C через FFI. Я хотел бы использовать мою привязку изнутри ghci в osx. В моих ограничениях я не могу просто передать источники C в ghc в файле .cabal. Это связано с ограничением с ghc/cabal, которое может быть исправлено в следующем выпуске ghc (но я хочу, чтобы мой код работал сейчас и в старых версиях). Подробнее см. .
Суть этой ошибки в том, что код C необходимо скомпилировать с помощью некоторых модулей Objective-C, а ghc неправильно интерпретирует их как скрипты компоновщика. Я пробовал много вещей, и создание файлов с помощью make файла - единственное, что сработало. На самом деле, это не должно быть проблемой, хотя, поскольку она должна быть такой же, как если бы я решил использовать внешнюю библиотеку C, которую я сам не создал. Ради этой проблемы позвольте представить себе отдельную библиотеку C, которую я могу легко перестроить с различными параметрами.
Если я создам библиотеку C как .a, то ghci компилирует, что он не может открыть .dylib. Мой первый вопрос: зачем ghci нужен .dylib и действительно ли он его использует?
Когда я создаю dylib, я получаю segfault при загрузке кода в ghci.
Имейте в виду, что эта привязка работает уже на других платформах, как в Linux, так и в Windows, и привязка отлично работает в osx, когда я компилирую вместо использования ghci. Эта проблема специфична для компиляции osx/ghci.
В этом следе выше я использую gdb, но он сбой, независимо от того, использую ли я gdb. Я отследил его до линий, которые вызывают сбой:
void _glfwClearWindowHints( void )
{
memset( &_glfwLibrary.hints, 0, sizeof( _glfwLibrary.hints ) );
}
Проблема заключается в том, что строка memset, ну, на самом деле проблема заключается в том, что при запуске внутри ghci записи в структуру подсказок _glfwLibrary
происходит нарушение доступа к памяти. Структура подсказок - это просто куча ints. Он очень плоский и простой, и поэтому я думаю, что проблема связана с тем, как я связываю вещи или с тем, как ghci загружает код.
Вот бит моего make файла, который я использую для создания dylib и .a:
GCCFLAGS := $(shell ghc --info | ghc -e "fmap read getContents >>= \
putStrLn . unwords . read . Data.Maybe.fromJust . lookup \
\"Gcc Linker flags\"")
FRAMEWORK := -framework Cocoa -framework OpenGL
GLFW_FLAG := $(GCCFLAGS) -O2 -fno-common -Iglfw/include -Iglfw/lib \
-Iglfw/lib/cocoa $(CFLAGS)
all: $(BUILD_DIR)/static/libglfw.a $(BUILD_DIR)/dynamic/libglfw.dylib
$(BUILD_DIR)/dynamic/libglfw.dylib: $(OBJS)
$(CC) -dynamiclib -Wl,-single_module -compatibility_version 1 \
-current_version 1 \
$(GLFW_FLAG) -o [email protected] $(OBJS) $(GLFW_SRC) $(FRAMEWORK)
$(BUILD_DIR)/static/libglfw.a: $(OBJS)
ar -rcs [email protected] $(OBJS)
Большинство флагов берутся прямо из GLFW Makefile, поэтому я думаю, что они должны быть правильными для этой библиотеки.
Первая строка выглядит немного странно, но это решение, которое я использовал для этой проблемы .
Подробная информация о платформе:
- OSX 10.6.6
- x86_64
- 4 ядра
- GHC версия 7.0.3, установленная с помощью установщика платформы Haskell
- Source repo: https://github.com/dagit/GLFW-b
Изменить: вот мои вопросы:
- Если это работает с ghci?
- Если да, то что я делаю неправильно или как я могу исправить ошибку?
- Могу ли я просто познакомиться со статической версией .a библиотеки с ghci?