OSX,ghci,dylib,正确的方法是什么?

问题描述

| 我需要构建一些C代码,然后通过FFI引用该C代码。我想在osx上的ghci内部使用绑定。我的制约因素是,我不能仅将C源代码交给.cabal文件中的ghc。这是由于ghc / cabal的限制可能会在ghc的下一个版本中修复(但我希望我的代码现在和较旧的版本都可以使用)。有关详细信息,请参见此错误。 该错误的要点是C代码需要使用一些Objective-C模块进行编译,而ghc却将其误解为链接程序脚本。我已经尝试了很多事情,并且用makefile自己构建文件是唯一有效的方法。确实,这不应该是一个问题,因为它应该与我决定使用自己没有构建的外部C库一样。为了解决这个问题,我们假设它是一个单独的C库,我可以使用其他选项轻松地对其进行重建。 如果我将C库构建为.a,则ghci抱怨说它无法打开.dylib。我的第一个问题是:ghci为什么需要.dylib?它真的使用它吗? 当我构建一个dylib时,将代码加载到ghci中会遇到段错误。 请记住,此绑定已经在其他平台(Linux和Windows)上都可以使用,并且在我编译而不是使用ghci时,该绑定在osx上可以正常使用。此问题特定于osx / ghci组合。 在上面的跟踪中,我正在使用gdb,但是无论是否使用gdb,它都会崩溃。我跟踪到导致崩溃的行:
void _glfwClearWindowHints( void )
{
    memset( &_glfwLibrary.hints,sizeof( _glfwLibrary.hints ) );
}
麻烦的制造者是memset行,实际上问题是在ghci中运行时,写入
_glfwLibrary
的提示结构是内存访问冲突。提示结构只是一堆int。它非常平坦和简单,因此我认为问题在于我如何链接事物或ghci加载代码的方式都存在问题。 这是我用于生成dylib和.a的makefile的位:
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 $@ $(OBJS) $(GLFW_SRC) $(FRAMEWORK)

$(BUILD_DIR)/static/libglfw.a: $(OBJS)
  ar -rcs $@ $(OBJS)
大多数标志直接取自GLFW Makefile,因此我认为它们对于该库应该是正确的。 第一行看起来有些怪异,但这是我用于解决此问题的解决方案。 平台详细信息: OSX 10.6.6 x86_64 4芯 通过Haskell Platform安装程序安装的GHC版本7.0.3 源回购:https://github.com/dagit/GLFW-b 编辑:这是我的问题: 应该与ghci一起使用吗? 如果是这样,我在做什么错或者我该如何解决崩溃问题? 我可以通过ghci静态访问库的.a版本吗?     

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)