免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2623 | 回复: 7
打印 上一主题 下一主题

用过h2xs的朋友指教一下好吗 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-24 20:33 |只看该作者 |倒序浏览
想为一个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的资料呢?不胜感激!!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2007-05-24 23:57 |只看该作者
上 maillist 吧。会这个的人不多。我只会一点点,勉强能解决自己的问题而已。

论坛徽章:
0
3 [报告]
发表于 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. }
复制代码

论坛徽章:
0
4 [报告]
发表于 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;

论坛徽章:
0
5 [报告]
发表于 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再發布,不過我沒用過。

论坛徽章:
0
6 [报告]
发表于 2007-05-28 16:55 |只看该作者
好的,谢谢指教!我再认真看看文档

论坛徽章:
0
7 [报告]
发表于 2007-05-28 16:56 |只看该作者
自己修改makemaker参数能解决很多问题.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2007-05-30 21:25 |只看该作者
原帖由 福瑞哈哥 于 2007-5-25 09:10 发表
h2xs這玩意不好用,改用Inline::C吧,非常簡單。

我总觉得 Inline::C 不如 XSUB 好用。
XSUB 可以少写很多代码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP