嘿,我正在学习Haskell,我有兴趣用它来制作静态库,可以在Python和C中使用.经过一些谷歌搜索我发现如何让GHC输出一个共享对象,但它动态地依赖于GHC`的图书馆.在GHC中编译得到的ELF是动态依赖的,并且只依赖于C libs,并且它的大小在MB之下 - 它与GHC的libs静态链接.如何以及是否可以实现共享对象?
当前状态示例:
$ ghc --make -dynamic -shared -fPIC foo.hs -o libfoo.so
$ ldd libfoo.so
    linux-vdso.so.1 =>  (0x00007fff125ff000)
    libHSbase-4.2.0.2-ghc6.12.3.so => /usr/lib/ghc-6.12.3/base-4.2.0.2/libHSbase-4.2.0.2-ghc6.12.3.so (0x00007f7d5fcbe000)
    libHSinteger-gmp-0.2.0.1-ghc6.12.3.so => /usr/lib/ghc-6.12.3/integer-gmp-0.2.0.1/libHSinteger-gmp-0.2.0.1-ghc6.12.3.so (0x00007f7d5faac000)
    libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007f7d5f816000)
    libHSghc-prim-0.2.0.0-ghc6.12.3.so => /usr/lib/ghc-6.12.3/ghc-prim-0.2.0.0/libHSghc-prim-0.2.0.0-ghc6.12.3.so (0x00007f7d5f591000)
    libHSffi-ghc6.12.3.so => /usr/lib/ghc-6.12.3/libHSffi-ghc6.12.3.so (0x00007f7d5f383000)
    libc.so.6 => /lib/libc.so.6 (0x00007f7d5f022000)
    /lib/ld-linux-x86-64.so.2 (0x00007f7d60661000)
$ ghc foo.hs
$ ldd foo
    linux-vdso.so.1 =>  (0x00007fff2d3ff000)
    libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007f50014ec000)
    libm.so.6 => /lib/libm.so.6 (0x00007f5001269000)
    librt.so.1 => /lib/librt.so.1 (0x00007f5001061000)
    libdl.so.2 => /lib/libdl.so.2 (0x00007f5000e5d000)
    libc.so.6 => /lib/libc.so.6 (0x00007f5000afc000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x00007f50008df000)
    /lib/ld-linux-x86-64.so.2 …嘿,我真的很挣这个.我试图将一小部分别人的代码移植到Python,这就是我所拥有的:
typedef struct
{
  uint8_t Y[LUMA_HEIGHT][LUMA_WIDTH];
  uint8_t Cb[CHROMA_HEIGHT][CHROMA_WIDTH];
  uint8_t Cr[CHROMA_HEIGHT][CHROMA_WIDTH];
} __attribute__((__packed__)) frame_t;
frame_t frame;
 while (! feof(stdin))
  {
    fread(&frame, 1, sizeof(frame), stdin);
    // DO SOME STUFF
  }
后来我需要像这样访问数据:frame.Y [x] [y]
所以我在Python中创建了一个Class'frame'并插入了相应的变量(frame.Y,frame.Cb,frame.Cr).我试图按顺序将数据从Y [0] [0]映射到Cr [MAX] [MAX],甚至打印出C结构中的操作但是没有设法绕过用于放置数据的方法在那里.我一夜之间一直在苦苦挣扎,今晚必须回到军队,所以任何直接的帮助都非常受欢迎和赞赏.
谢谢