如何在Perl中使用指向SWIG的char指针?

时间:2009-09-07 05:01:27

标签: c++ perl swig

我使用SWIG为C ++程序生成Perl模块。我在C ++代码中有一个函数,它返回一个“char指针”。现在我不知道如何在Perl中打印或获取返回的char指针。

示例C代码:

 char* result() { 
     return "i want to get this in perl"; 
 } 

我想在Perl中调用此函数“result”并打印字符串。

怎么做?

此致 阿南丹

2 个答案:

答案 0 :(得分:5)

根据C ++接口的复杂性,跳过SWIG并自行编写XS代码可能更容易,更快速,更易于维护。 XS和C ++是一种神秘的艺术。这就是Mattia Barbon在CPAN上出色的ExtUtils::XSpp模块的原因。它使包装C ++变得容易(而且几乎很有趣)。

ExtUtils :: XSpp发行版包含一个非常简单(和设计)example的类,它有一个字符串(char *)和一个整数成员。以下是缩减界面文件的样子:

// This will be used to generate the XS MODULE line
%module{Object::WithIntAndString};

// Associate a perl class with a C++ class
%name{Object::WithIntAndString} class IntAndString
{
  // can be called in Perl as Object::WithIntAndString->new( ... );
  IntAndString();

  // Object::WithIntAndString->newIntAndString( ... );
  // %name can be used to assign methods a different name in Perl
  %name{newIntAndString} IntAndString( const char* str, int arg );

  // standard DESTROY method
  ~IntAndString();

  // Will be available from Perl given that the types appear in the typemap
  int GetInt();
  const char* GetString ();

  // SetValue is polymorphic. We want separate methods in Perl
  %name{SetString} void SetValue( const char* arg = NULL );
  %name{SetInt} void SetValue( int arg );
};

请注意,这仍然需要有效的XS typemap。它非常简单,所以我不会在这里添加它,但您可以在上面链接的示例分发中找到它。

答案 1 :(得分:-1)

您必须参考www.swig.org/tutorial.html
上的SWIG教程 无论如何,因为你只想从perl调用函数C函数,
1.键入您的接口文件(在包装器和模块部分中包含所有函数声明) 2.使用swig和选项进行编译 3.使用gcc编译以创建对象 4.使用gcc选项编译以创建共享对象 5.按如下方式运行程序:

perl  
use moduleName;  
$a = moduleName::result();  

[注意:查看生成的模块文件(.pm)以获取正确的funvtion原型,该原型指向包装文件中的正确函数。]