Chinaunix

标题: 用过h2xs的朋友指教一下好吗 [打印本页]

作者: hgneng    时间: 2007-05-24 20:33
标题: 用过h2xs的朋友指教一下好吗
想为一个C库函数写个Perl接口,试了很久都不会用,perlxstut等文章看了一遍又一遍,学多问题还是找不到答案。

例如,size_t在typemap中有定义,但是为什么不能识别?

$ h2xs -x -O -n eSpeak espeak.h
...
Writing eSpeak/ppport.h
Scanning typemaps...
Scanning /usr/share/perl/5.8/ExtUtils/typemap
Scanning espeak.h for functions...
Expecting parenth after identifier in `size_t size'
after `size_t ' at /usr/local/share/perl/5.8.8/C/Scan.pm line 797.

涉及size_t的那段代码如下:
espeak_ERROR espeak_Synth(const void *text,
        size_t size,
        unsigned int position,
        espeak_POSITION_TYPE position_type,
        unsigned int end_position,
        unsigned int flags,
        unsigned int* unique_identifier,
        void* user_data);

这些不解的问题还有很多,有没有更好的介绍如何做C语言binding的资料呢?不胜感激!!
作者: flw    时间: 2007-05-24 23:57
上 maillist 吧。会这个的人不多。我只会一点点,勉强能解决自己的问题而已。
作者: 福瑞哈哥    时间: 2007-05-25 09:10
h2xs這玩意不好用,改用Inline::C吧,非常簡單。


  1. package MyWrapper;
  2. use Inline => Config => LIBS => '-L/usr/local/mylib -lmylib';
  3. use Inline => Config => INC  => '-I/usr/local/mylib';
  4. use Inline C;
  5. sub version {
  6.    return "MyWrapper 2.0";
  7. }
  8. __DATA__
  9. __C__
  10. #include "mylib.h"
  11.    
  12. SV* new() {
  13.     void * session = newsession();
  14.     SV*    obj_ref = newSViv(0);
  15.     SV*    obj = newSVrv(obj_ref, class);
  16.     sv_setiv(obj, (IV)session);
  17.     SvREADONLY_on(obj);
  18.     return obj_ref;
  19. }
  20.    
  21. void set (SV* obj, char *attribute, char *value) {
  22.     setattribute ( ((void*)SvIV(SvRV(obj))), attribute, value);
  23. }
  24.    
  25. char* get (SV* obj) {
  26.     return getresult ( ((void *)SvIV(SvRV(obj))) );
  27. }
  28.    
  29. void DESTROY(SV* obj) {
  30.     return freesession ( ((void *)SvIV(SvRV(obj))) );
  31. }
复制代码

作者: hgneng    时间: 2007-05-28 15:44
谢谢楼上两位大侠! 福瑞哈哥 好像很熟的样子,我之前也试过Inline::C,但我想写完后发布,我感觉h2xs好像比较适合和标准。我见到SvRV这些东西就头痛。我想请问以下两种类型怎样转换:

typedef enum {
  A,
  B
} MYENUM;

typedef struct {
  char *a;
  union {
    int b;
    float c;
  } num;
} my_struct;
作者: 福瑞哈哥    时间: 2007-05-28 16:39
原帖由 hgneng 于 2007-5-28 15:44 发表
谢谢楼上两位大侠! 福瑞哈哥 好像很熟的样子,我之前也试过Inline::C,但我想写完后发布,我感觉h2xs好像比较适合和标准。我见到SvRV这些东西就头痛。我想请问以下两种类型怎样转换:

typedef enum {
  A,
...


可惜我對XS並不熟悉,而且也不想搞它了。h2xs其實並不更適合和標準,它只更早出現而已,今後Inline::C將成為標準方法,Perl6也依賴於它。個人感覺Inline::C很簡單。唯一的缺陷是用戶需要Inline::C模組。或者開發者用InlineX::XS自動生成XS再發布,不過我沒用過。
作者: hgneng    时间: 2007-05-28 16:55
好的,谢谢指教!我再认真看看文档
作者: rrrrrrrr8    时间: 2007-05-28 16:56
自己修改makemaker参数能解决很多问题.
作者: flw    时间: 2007-05-30 21:25
原帖由 福瑞哈哥 于 2007-5-25 09:10 发表
h2xs這玩意不好用,改用Inline::C吧,非常簡單。

我总觉得 Inline::C 不如 XSUB 好用。
XSUB 可以少写很多代码。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2